9

我正在学习编程,而 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 个整数。所以它没有调整大小。我想知道 - 初始化后是否可以调整数组大小?

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

4

6 回答 6

19

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

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

于 2009-04-16T16:20:47.990 回答
4

我的建议更强烈:std::vector<>除非您有充分的理由使用 C 样式数组,否则请使用 (et. al.)。由于您正在学习 C++,我怀疑您是否有这样的原因:使用std::vector<>.

于 2009-04-16T16:45:51.317 回答
2

我也会推荐std::vector。但是,如果您被数组困住,您可以随时malloc使用内存,然后realloc如果您需要使数组更大。

在 SO 上进行搜索,有关于malloc和的信息realloc

于 2009-04-16T17:26:53.587 回答
1

如果要调整数组的大小,可能需要使用可以自动调整大小的向量。

于 2009-04-16T16:21:09.690 回答
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) 将边界检查添加到向量访问。

于 2009-04-16T16:52:17.277 回答
0

如果您想知道为什么您的第一个想法已编译但似乎不起作用:

当您在 if 语句中省略大括号时:

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

就像您使用它们一样:

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

所以它正在制作一个正确大小的“farray”——然后它立即超出范围并消失了,你只剩下原始的了。

于 2009-04-16T17:23:18.947 回答