【问题标题】:Can you resize a C++ array after initialization? [duplicate]初始化后可以调整 C++ 数组的大小吗? [复制]
【发布时间】:2010-10-19 21:43:48
【问题描述】:

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

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

【问题讨论】:

    标签: c++ arrays resize sizeof


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢。我已经弄清楚了如何将 std::vector 实现到这个算法中。虽然我希望我没有花两个小时调试我的代码,只是为了弄清楚我的函数头“int mergeSort(std::vector, int)”缺少一个“”=/
    • vectors 不是由动态数组支持吗?动态调整数组或向量的大小应该会导致相同的性能损失>
    【解决方案2】:

    如果你想调整一个数组的大小,你可能想使用一个可以自动调整大小的向量。

    【讨论】:

      【解决方案3】:

      我的建议更强烈:除非您有充分的理由使用 C 样式数组,否则请使用 std::vector&lt;&gt;(等)。既然你正在学习 C++,我怀疑你有这样的理由:使用std::vector&lt;&gt;

      【讨论】:

      • 给定向量保证使用连续存储,即使传递给采用指针的方法,您也可以使用向量。只有在将引用/指针传递给用于调整数据大小的方法的指针时,您才会坚持使用原始内存。
      【解决方案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) 为向量访问添加边界检查。

      【讨论】:

      • 请不要对代码使用“pre”HTML标签 - 而是用鼠标选择代码并键入 ctrl-K 或单击代码图标
      • 他应该使用vector(iter, iter) 构造函数。矢量 farray(originalarray.begin(), &originalarray[half]), sarray(&originalarray[half], originalarray.end());之后它会删除副本。但这可能令人困惑。
      【解决方案5】:

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

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

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

      就像你使用它们一样:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 我也使用这个约定。
        猜你喜欢
        • 1970-01-01
        • 2020-08-26
        • 1970-01-01
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2023-02-23
        相关资源
        最近更新 更多