如何调整动态数组的大小?

时间:2013-09-30 22:33:50

标签: c++

假设我有一个动态数组:

int* p;
ifstream inFile("pop.txt");
int x;

while (inFile >> x)
{
    // ????
}

如何调整p的大小,以便我能够像数组一样使x适合。我不想使用矢量或静态数组,因为我正在尝试学习该语言。我需要使用指针,因为我不知道初始大小。任何尝试都表示赞赏。

3 个答案:

答案 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 ++标准库的一部分。无需繁琐的newdelete 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;
}