如何声明2D向量包含2D向量?

时间:2020-06-08 13:59:08

标签: c++ vector c++17 stdvector

这在c ++中使我感到困惑(17) 我想声明一个任意大小的二维向量,每个成员本身也是2D向量。 我想制作已知大小的空向量。实际上,我希望在声明时设置其大小。 为了获得更好的图像,请想象一个经典的数独谜题,它在3x3网格中有9个房子,每个房子在3x3网格中有9个单元格。

    #include<iostream>
    #include <vector>
    using cell_t = std::vector<std::vector<int> >;
    using board_t = std::vector<std::vector<cell_t> >;
    cell_t temp(3, std::vector<int>(3)); //this would be a 2D vector member

现在是问题:

     board_t test(3,std::vector<cell_t>(3,std::vector<int>(3)));//this won't work

编译器错误: 错误C2440':无法从'初始化列表'转换为'std :: vector>'Training2 main.cpp

错误(活动)E0289没有构造函数“ std :: vector <_Ty,_Alloc> :: vector [with _Ty = cell_t,_Alloc = std :: allocator]”的实例与参数列表Training2 main.cpp 91匹配。 >

我想知道我错过了什么?我知道我可以通过临时cell_t来做到这一点,例如:

    cell_t temp(3, std::vector<int>(4));
    board_t test(3,std::vector<cell_t>(3,temp));

但是我宁愿使用未知对象。
另一方面,我知道如何使用resize()push_back()来将向量调整为所需大小。但是,在声明时使它发生而不是执行其他过程是否更快?因为我要空向量

2 个答案:

答案 0 :(得分:3)

您当前的类型定义使拥有非正方形单元和面板变得容易,并且您可以通过很多间接操作来到达元素。如果将其封装在一个类中,则初始化程序可能会丢失当前重复的大部分内容。

struct index_t {
    std::size_t x;
    std::size_t y;
};

template <typename T>
class square_matrix {
    std::size_t size;
    std::vector<T> elems;

    std::size_t position(index_t index) { return index.x + (index.y * size); }

public:
    square_matrix(std::size_t size, T elem = {}) : size(size), elems(size * size, elem) {}
    T& operator[](index_t index) { return elems[position(index)]; }
    const T& operator[](index_t index) const { return elems[position(index)]; }
};

using cell_t = square_matrix<int>;
using board_t = square_matrix<cell_t>;

board_t test(3, cell_t(3));

答案 1 :(得分:0)

事实证明,问题在于定义cell_t声明的向量。


     board_t test(3,std::vector<cell_t>(3,std::vector<int>(3)))
    //                        @a^^^^^^^  @b^^^^^^^^^^^^^^^

@a我们有一个cell_t向量,但是@b我们描述了一个'int向量' 那就是问题所在。 我们应该经过cell_t(3,std::vector<int>(3)而不是@b 它应该像这样:

    board_t test(3, std::vector<cell_t>(3, cell_t(3, std::vector<int>(3))));