Home Articles

初始化后你可以调整C数组的大小吗? [重复]

Asked
Viewed 146 times
8

这个问题在这里已有答案:

我正在学习编程,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 Answers

  • 18

    C数组的大小是固定的 .

    如果您需要"resizable array",则需要使用std::vector而不是数组 .

  • 4

    您可以使用带有向量的[]运算符,就像在数组中一样 . 你可以使用这样的向量来实现它(如果你想使用更多的向量方法):

    #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)向矢量访问添加边界检查 .

  • 2

    我的建议更强烈:使用 std::vector<> (等人),除非你有充分的理由使用C风格的数组 . 既然你正在学习C,我怀疑你有这样的理由: use std::vector<> .

  • 1

    我也建议 std::vector . 但是,如果您坚持使用数组,则可以始终使用内存,然后使用 realloc (如果需要使数组更大) .

    在这里搜索SO,有关于 mallocrealloc 的信息 .

  • 1

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

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

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

    它就像你使用它们一样:

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

    所以它正在制作一个正确尺寸的“远射” - 然后它立即超出范围并且消失了,而你只剩下原始的那个 .

  • 0

    如果要调整数组大小,可能需要使用矢量,该矢量可以自动调整大小 .

Related