【问题标题】:How to declare std::vector with an 'n' dimensional array?如何用“n”维数组声明 std::vector?
【发布时间】:2015-07-24 22:39:04
【问题描述】:

我的想法如下:
例如一个二维数组:

int a[9][9];
std::vector<int** a> b;

如果我有怎么办

/* I know, it is usually a bad practise to have more than 2 dimensional arrays, but it can happen, when you need it */
int a[3][4][5][6]; 
std::vector<int**** a> b; // ? this just looks bad

【问题讨论】:

  • 你能用std::array代替c风格的数组吗?
  • 这是一个指针向量,而不是多维数组。要么使用向量的向量(向量......),要么使用平面vector&lt;int&gt; 使用算术进行多维索引。
  • @dwcanillas 是的,我可以使用 std::array
  • @Mike Seymour 使用算术进行多维索引被我的上级否决,因为这会使代码难以阅读和维护。但是,是的,这将是一个很好的解决方案。
  • @Snowman:将向量包装在一个类中,并将算法包装在一个访问器函数中。那么它就可以像a(1,2,3) = 42;一样简单易读

标签: c++ c++11 vector multidimensional-array stdvector


【解决方案1】:

你可以这样做

int a[3][4][5][6]; 
std::vector<int**** a> b; 

这样的两种方式

int a[3][4][5][6]; 
std::vector<int ( * )[4][5][6]> b; 

b.push_back( a );

像这样

int a[3][4][5][6]; 
std::vector<int ( * )[3][4][5][6]> b; 

b.push_back( &a );

虽然不清楚你想要达到什么目的。:)

【讨论】:

  • Mike Seymour 在 cmets 中所说的,是我想要实现的 :) 我只是想知道,在这种情况下,最佳实践是什么(我是学生,想学习交易技巧 )。我已经在实现它:“将向量包装在一个类中,并将算术包装在一个访问器函数中。然后它可以像 a(1,2,3) = 42 一样容易阅读”
【解决方案2】:

试试这个:

struct MD_array{ //multidimentional array
   a[3][4][5][6];
};
std::vector<MD_array> b;

然后你可以像这样访问每个数组:

b[i].a[x][y][z][w] = value;

【讨论】:

    【解决方案3】:

    您也可以使用别名声明:

    template <typename T, size_t I, size_t J, size_t K, size_t N>
    using SomeArr = std::array<std::array<std::array<std::array<T, I>, J>, K>, N>;
    
    int main()
    {
        SomeArr<int,3,4,5,6> arr;
        std::vector<SomeArr<int,3,4,5,6>> someVec;
        someVec.push_back(arr);
    }
    

    【讨论】:

    • 你可以概括一下你的别名。见this question
    • @Barry 很好,谢谢。还在工作中使用 VS2012,所以我还没有学习 2013/2015 附带的所有内容
    • @Barry 为什么在该答案中使用结构?仅使用别名声明就不可能吗?
    • 你能想出办法吗?我很确定这是不可能的。
    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多