【问题标题】:Accessing an entire row of a multidimensional array in C++在 C++ 中访问多维数组的整行
【发布时间】:2013-02-20 21:41:58
【问题描述】:

如何访问多维数组的一整行? 例如:

int logic[4][9] = {
    {0,1,8,8,8,8,8,1,1},
    {1,0,1,1,8,8,8,1,1},
    {8,1,0,1,8,8,8,8,1},
    {8,1,1,0,1,1,8,8,1}
};

// I want everything in row 2. So I try...
int temp[9] = logic[2];

我的尝试抛出了错误:

数组初始化需要花括号

我知道我可以使用 FOR 循环检索该行,但是我很好奇是否有更明显的解决方案。

【问题讨论】:

  • 可能的替代方案:std::vector<int> temp(std::begin(logic[2]), std::end(logic[2])); ?
  • 数组不是太 C++。如果可以,请使用std::vector
  • 您可以查看valarrayslice

标签: c++ multidimensional-array


【解决方案1】:

这不是数组/指针在 C++ 中的工作方式。

该数组存储在内存中的某个位置。为了引用相同的数据,您需要一个指向数组开头的指针:

int* temp = logic[2];

或者,如果您需要该数组的副本,则必须分配更多空间。

静态:

int temp[9];
for (int i = 0; i < 9; i++) {
    temp[i] = logic[2][i];
}

动态:

// allocate
int* temp = new int(9);
for (int i = 0; i < 9; i++) {
    temp[i] = logic[2][i];
}

// when you're done with it, deallocate
delete [] temp;

或者由于您使用的是 C++,如果您不想担心所有这些内存内容和指针,那么您应该对动态大小的数组使用 std::vector&lt;int&gt;,对静态大小的数组使用 std::array&lt;int&gt;

#include <array>
using namespace std;

array<array<int, 9>, 4> logic = {
  {0,1,8,8,8,8,8,1,1},
  {1,0,1,1,8,8,8,1,1},
  {8,1,0,1,8,8,8,8,1},
  {8,1,1,0,1,1,8,8,1}
}};

array<int, 9> temp = logic[2];

【讨论】:

    【解决方案2】:

    除了将数组衰减为指针之外,您还可以将其绑定到引用:

    int (&temp)[9] = logic[2];
    

    这样做的一个优点是它允许您使用它基于 C++11 范围的 for 循环:

    for (auto t : temp) {
      // stuff
    }
    

    【讨论】:

      【解决方案3】:

      直接分配是行不通的。 C++ 不允许这样做。充其量您可以将它们分配为指向相同的数据 - int *temp = logic[2]。你需要一个 for 循环或类似下面的东西。

      我相信这会奏效:

      int temp[9];
      memcpy(temp, logic[2], sizeof(temp));
      

      但我通常建议改用std::vectorstd::array

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 2021-12-31
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        相关资源
        最近更新 更多