【问题标题】:How to resize array in C++?如何在 C++ 中调整数组的大小?
【发布时间】:2010-09-20 08:15:44
【问题描述】:

我需要在 C++ 中执行以下 C# 代码的等效操作

Array.Resize(ref A, A.Length - 1);

如何在 C++ 中实现这一点?

【问题讨论】:

  • 有什么理由不使用 std::vector 吗?

标签: c++


【解决方案1】:

你不能调整数组的大小,你只能分配一个新的(更大的)并复制旧数组的内容。 如果你不想使用std::vector(出于某种原因),这里是它的代码:

int size = 10;
int* arr = new int[size];

void resize() {
    size_t newSize = size * 2;
    int* newArr = new int[newSize];

    memcpy( newArr, arr, size * sizeof(int) );

    size = newSize;
    delete [] arr;
    arr = newArr;
}

代码来自这里http://www.cplusplus.com/forum/general/11111/

【讨论】:

  • newdelete 之间抛出异常时会发生什么? -1 向新手推荐手动资源管理。 (如果你想让这个安全,你需要一个智能指针。如果你添加更多的实用函数,你会到达std::vector。)
  • 感谢 -1 :) 我建议新手了解 在数组调整大小期间没有发生任何魔法,创建新数组并复制所有元素,如果你写每次需要添加额外元素时将数组大小调整 1 的代码,那么您将浪费资源。
  • 如果在newdelete 之间会抛出异常,这意味着你遇到了真正的麻烦,你不能在resize 函数中做任何事情,你不应该在那里捕获异常(也许只是为了重新抛出一些更丰富的信息)并让调用者处理它。
  • 无论如何你都应该尝试delete。这就是智能指针的用途。
  • @user:他说的是中间,不是。如果有人能够手动释放某些资源,那么他们就失败了。它需要包装,期间。没那么难。
【解决方案2】:

数组的大小在 C++ 中是静态的。您不能动态调整它的大小。这就是std::vector 的用途:

std::vector<int> v; // size of the vector starts at 0

v.push_back(10); // v now has 1 element
v.push_back(20); // v now has 2 elements
v.push_back(30); // v now has 3 elements

v.pop_back(); // removes the 30 and resizes v to 2

v.resize(v.size() - 1); // resizes v to 1

【讨论】:

  • 顺便说一句,C#中的数组不是也是静态的吗?
  • @FredOverflow:是的,这是可能的。但是,我试图坚持问题中给出的代码。我想size-1 只是一个占位符。
  • @ironic:我想是这样,否则 iJeeves 代码中的 ref 就没有必要了。
【解决方案3】:
  1. 使用std::vector
  2. 编写您自己的方法。使用 new 分配内存块。使用该内存,您可以扩展至内存块的限制。

【讨论】:

    【解决方案4】:

    原始数组在 C++ 中不可调整大小。

    您应该使用类似 Vector 的类,它确实允许调整大小..

    std::vector 允许您调整它的大小以及在添加元素时允许动态调整大小(通常不需要手动调整大小来添加)。

    【讨论】:

      【解决方案5】:

      您不能这样做,请参阅this question 的答案。 您可以改用std:vector

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-02
        • 2017-01-05
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多