假设我有一个动态数组:
int* p;
ifstream inFile("pop.txt");
int x;
while (inFile >> x)
{
// ????
}
如何调整大小p
以便能够x
像数组一样适应。我不想在尝试学习语言时使用向量或静态数组。我需要使用指针,因为我不知道初始大小。任何尝试都值得赞赏。
假设我有一个动态数组:
int* p;
ifstream inFile("pop.txt");
int x;
while (inFile >> x)
{
// ????
}
如何调整大小p
以便能够x
像数组一样适应。我不想在尝试学习语言时使用向量或静态数组。我需要使用指针,因为我不知道初始大小。任何尝试都值得赞赏。
最简单的答案是您应该使用比原始数组和原始内存更高级别的组件进行读取。这样图书馆就会为你处理这个问题。将一组数字读入应用程序(无需错误处理)的简单方法可以使用以下简单代码完成:
std::vector<int> data;
std::copy(std::istream_iterator<int>(inFile), std::istream_iterator<int>(),
std::back_inserter(data));
该代码从流中创建了几个输入迭代器来读取int
值,并使用一个back_inserter
迭代器将其push_back
放到向量上。向量本身将根据需要管理内存缓冲区的增长。
如果您想手动执行此操作,您只需分配更大的内存块,从旧缓冲区复制前 N 个元素,释放旧缓冲区并继续读取,直到更大的缓冲区被填满,此时您跟随相同的过程:分配、复制、释放旧的、继续插入。
你不能调整它的大小。您所能做的就是分配一个更大的新数组,将旧数组中的所有内容复制到新数组,然后释放旧数组。
例如(未经测试的代码)
int array_size = 10;
int* array = new int[array_size];
int array_in_use = 0;
int x;
while (in >> x)
{
if (array_in_use == array_size)
{
int* new_array = new int[2*array_size];
for (int i = 0; i < array_size; ++i)
new_array[i] = array[i];
delete[] array;
array = new_array;
array_size *= 2;
}
array[array_in_use++] = x;
}
这很乏味,而且我不相信这对初学者来说是一件好事。如果你学会了如何正确使用向量,你会学到更多有用的东西。
你总是可以使用realloc()。它是 C 标准库的一部分,而 C 标准库是 C++ 标准库的一部分。不需要繁琐new
的s和delete
s。
#include <cstdlib>
#include <iostream>
#include <fstream>
int main(void)
{
int* array = nullptr;
unsigned int array_size = 0;
std::ifstream input("pop.txt");
for(int x; input >> x;)
{
++array_size;
int* array_failsafe = array;
array = static_cast<int*>(realloc(array, sizeof(x) * array_size));
if(array == nullptr)
{
std::cerr << "realloc() failed!" << std::endl;
free(array_failsafe);
return EXIT_FAILURE;
}
array[array_size-1] = x;
}
for(unsigned int i = 0; i < array_size; ++i)
{
std::cout << "array[" << i << "] = " << array[i] << std::endl;
}
free(array); // Don't forget!
return EXIT_SUCCESS;
}