c++ - 扩展动态分配的数组

标签 c++ arrays dynamic

我分配了一个数组如下。

#include <iostream>

int main() {
    const int first_dim = 3;
    const int second_dim = 2;

    // Allocate array and populate with dummy data
    int** myArray = new int*[first_dim];
    for (int i = 0; i < first_dim; i++) {
        myArray[i] = new int[second_dim];
        for (int j = 0; j < second_dim; j++) {
            myArray[i][j] = i*second_dim + j;
            std::cout << "[i = " << i << ", j = " << j << "] Value: " << myArray[i][j] << "\n";
        }
    }

    // De-allocate array
    for (int i = 0; i < first_dim; i++)
        delete[] myArray[i];
    delete[] myArray;
}

假设我想将第 4 个元素添加到第一个维度,即 myArray[3]。这可能吗?

我听说 Vector 在这方面的效率要高得多,但我几乎不知道它们是什么,而且我以前从未使用过它们。

最佳答案

是的,但以一种非常痛苦的方式。你要做的是分配新的内存,它现在有你想要的新尺寸,在本例中是 4 和 2,然后将矩阵的所有内容复制到新矩阵,然后释放前一个矩阵的内存......就是这样痛苦。现在让我们看看如何用 vector 完成相同的操作:

#include <vector>
using std::vector;

int main()
{
   vector< vector <int> > matrix;
   matrix.resize(3);
   for(int i = 0; i < 3; ++i)
      matrix[i].resize(2);

   matrix[0][1] = 4;
   //...

   //now you want to make the first dimension 4? Piece of cake

   matrix.resize(4);
   matrix[3].resize(2);
}

HTH

编辑: 对您的原始代码的一些评论:

  • 在 C++ 中,ALL_CAP_NAMES 通常指代宏(您#define 的东西)。避免在其他情况下使用它们
  • 为什么声明 FIRSTDIM 和 SECONDDIM 是静态的?那是绝对没有必要的。如果局部变量是静态的,则非正式地意味着下次您使用保留值调用该函数时它将是相同的变量。由于从技术上讲您不能再次调用 main,因此这是无用的。即使你能做到,它仍然没有用。
  • 你应该编写 delete [] array[i];delete [] array; 这样编译器就知道你正在尝试的 int* 和 int** delete 实际上指向一个数组,而不仅仅是一个 int 或 int*。

关于c++ - 扩展动态分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3980552/

相关文章:

c - 是否可以按位分配动态内存?

java - 将动态属性映射读入 Spring 托管 bean

firefox - Javascript : Onload event in Firefox not firing

c++ - 分发具有可执行文件的共享对象(最佳实践?)

java - 在不使用任何 String 函数的情况下读取字符数组中的字符串,甚至不使用 Java 中的 charAt

java - 从 char 转换为 long

python - 如何使用基本操作更改列表中的值?

c++ - 如何访问 child 的 protected 变量

c++ - WM_SYSCOMMAND SC_MOVE 耗尽鼠标事件并且鼠标弹起未触发

java - 如何在c++程序中调用返回类对象的java函数并接收该对象?