假设我有一个动态数组:
int* p;
ifstream inFile("pop.txt");
int x;
while (inFile >> x)
{
// ????
}
如何调整p
的大小,以便我能够像数组一样使x
适合。我不想使用矢量或静态数组,因为我正在尝试学习该语言。我需要使用指针,因为我不知道初始大小。任何尝试都表示赞赏。
答案 0 :(得分:4)
最简单的答案是,您应该使用比原始数组和原始内存更高级别的组件来进行读取。这样,图书馆将为您处理这个问题。可以使用这个简单的代码将一组数字读入应用程序(无错误处理)的简单方法:
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个元素,释放旧缓冲区并继续读取,直到更大的缓冲区被填满,指出你遵循相同的程序:分配,复制,取消分配旧的,继续插入。
答案 1 :(得分:2)
您无法调整大小。你所能做的就是分配一个新的更大的数组,将旧数组中的所有数据复制到新数组,然后释放旧数组。
例如(未经测试的代码)
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;
}
这很乏味,我不相信这对初学者来说是件好事。如果你学会了如何正确使用向量,你将学到更多有用的东西。
答案 2 :(得分:1)
你可以始终使用realloc()。它是C标准库的一部分,C标准库是C ++标准库的一部分。无需繁琐的new
和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;
}