你可以在初始化后重新调整C++数组的大小吗?

10

我正在学习编程,C++是我学的第一门语言。请不要使用指针来展示 - 我还不理解它们,直到我有更多的空闲时间来专注于这个问题。

    int mergeSort()
{
    const int n = 9;
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8};


    const int halfelements = (sizeof(originalarray) / sizeof(int)) / 2;
    int farray[halfelements];
    int sarray[halfelements];

    for (int i = 0; i < halfelements; i++) {
        farray[i] = originalarray[i];
    }

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) {
        sarray[x] = originalarray[i];
    }

我被分配(我不是上课,只是和几个朋友一起学习)一个归并排序算法,其中算法已经解释过了,但没有实现。我希望重新编写它,使其适用于奇数和偶数整数。我尝试添加以下代码:

if ((n % 2) != 0) int farray[halfelements + 1];

这样我就可以使用相同的整数来迭代两个后续数组。 sizeof(farray)显示为16字节,或4个整数。因此它没有重新调整大小。我想知道的是 - 是否可以在初始化后调整数组大小?

编辑:我该如何实现一个向量?我不明白如何在循环中使用迭代器来迭代并复制值。

6个回答

20

C++ 数组大小是固定的。

如果您需要“可调整大小的数组”,则应使用std::vector而不是数组。


好的,谢谢。我已经弄清楚了如何将std::vector的实现应用到这个算法中。虽然我希望我没有花两个小时来调试我的代码,只是为了发现我的函数头"int mergeSort(std::vector, int)"缺少了一个"<int>"这个部分 =/ - jkeys
“vector”不是基于动态数组的吗?动态调整数组或向量大小应该会产生相同的性能惩罚,对吧? - Jason

4

我的建议更加强烈:除非你有很好的理由使用C风格数组,否则请使用std::vector<>等。既然你正在学习C++,我怀疑你没有这样的理由: 使用std::vector<>


给定一个向量,保证使用连续的存储空间,即使传递给一个接受指针的方法,你也可以使用向量。只有当传递一个引用/指针到一个方法来确定数据大小时,你才必须使用原始内存。 - Richard

1

您可以像在数组中一样使用[]运算符来操作向量。如果您想要使用更多的向量方法,可以像这样使用向量实现:

#include <vector>

const int halfelements = originalarray.size()/2; //use size to get size
vector <int> farray(halfelements);
vector <int> farray(halfelements);

for (int i = 0; i < halfelements; i++) {
    farray.push_back(originalarray[i]); //adds element at i to the end of vector
}

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) {
    sarray.push_back(originalarray[i]);
}

您还可以使用 .at(index) 来为向量访问添加边界检查。

请勿使用“pre”HTML标记来处理代码 - 相反,请使用鼠标选择代码,然后按Ctrl-K或单击代码图标。 - anon
他应该使用vector(iter, iter)构造函数。vector<int> farray(originalarray.begin(), &originalarray[half]), sarray(&originalarray[half], originalarray.end()); 这样可以消除之后的复制。但这可能会让人感到困惑。 - jmucchiello

1
如果您想调整数组大小,您可能需要使用向量(vector),它可以自动调整大小。

1
我也建议使用 std::vector。但是如果你被迫使用数组,你可以使用 malloc 分配内存,然后在需要扩大数组时使用 realloc
在这里搜索 SO,有关于 mallocrealloc 的信息。

我也使用这个约定。 - user5066707

0
如果你想知道为什么你的第一个想法编译通过了但似乎没有起作用:
当你在if语句中省略花括号时:
if ((n % 2) != 0) int farray[halfelements + 1];

这与您直接使用它们没有任何区别:

if ((n % 2) != 0) {
  int farray[halfelements + 1];
}

因此,它正在创建一个正确大小的“farray” - 然后立即超出范围并消失,你只剩下原始的那个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接