我正在学习编程,而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个整数。所以它没有调整大小。我想知道的是 - 是否可以在数组初始化后重新调整大小?
编辑:我如何实现矢量?我不明白如何在循环中使用迭代器迭代并复制值。
答案 0 :(得分:18)
C ++数组的大小是固定的。
如果您需要“可调整大小的数组”,则需要使用std::vector而不是数组。
答案 1 :(得分:4)
我的建议更强烈:使用std::vector<>
(等人),除非你有充分的理由使用C风格的数组。由于您正在学习C ++,我怀疑您是否有这样的理由:使用std::vector<>
。
答案 2 :(得分:2)
我还建议std::vector
。但是,如果您坚持使用数组,则可以始终malloc
内存,然后realloc
如果需要使数组更大。
在此搜索SO,有关于malloc
和realloc
的信息。
答案 3 :(得分:1)
如果要调整数组大小,可能需要使用矢量,该矢量可以自动调整大小。
答案 4 :(得分: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)将边界检查添加到矢量访问。
答案 5 :(得分:0)
如果你想知道为什么你的第一个想法被编译但似乎不起作用:
当你在if语句中省略大括号时:
if ((n % 2) != 0) int farray[halfelements + 1];
就像你使用它们一样:
if ((n % 2) != 0) {
int farray[halfelements + 1];
}
所以它正在制作一个正确大小的'farray' - 然后它会立即超出范围并且消失了,而你只剩下原来的那个。