代码之家  ›  专栏  ›  技术社区  ›  jkeys

初始化后,你能调整C++数组的大小吗?[副本]

  •  8
  • jkeys  · 技术社区  · 15 年前

        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 回复  |  直到 15 年前
        1
  •  19
  •   Legion    15 年前

    C++数组大小固定。

    std::vector 而不是数组。

        2
  •  4
  •   Ðаn    15 年前

    std::vector<> (等)除非您有很好的理由使用C样式数组。既然你在学习C++,我怀疑你有这样的理由: 标准::向量<&燃气轮机; .

        3
  •  2
  •   Gregor Brandt    15 年前

    std::vector . 但是,如果您使用的是阵列,则始终可以 malloc realloc 如果需要将阵列放大。

    在这里搜索,这样就有了关于 realloc .

        4
  •  1
  •   tstenner    15 年前

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

        5
  •  1
  •   Gordon Gustafson    15 年前

    可以像在数组中一样对向量使用[]运算符。您可以使用类似这样的向量来实现这一点(如果您想使用更多的向量方法):

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

        6
  •  0
  •   Ken    15 年前

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

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

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

    就像你用过它们一样:

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

    因此,它正在制造一个大小正确的“远光”——然后它立即超出范围,消失了,只剩下原来的一个。