我们可以使用std :: vector定义固定宽度的2D矩阵吗?

时间:2017-06-21 16:06:56

标签: c++ c++11 vector

我使用以下示例来说明我的问题:

std::vector<std::vector<int> > abc;
abc.push_back(std::vector<int>(9,0));
abc.push_back(std::vector<int>(9,2));
...
abc.push_back(std::vector<int>(9,20));

正如您在每次将矢量放入2D矢量时从示例中看到的那样,它的尺寸是相同的。变量abc表示固定宽度的矩阵,其高度可根据要求增加或减少。因此,我想定义类似std::vector<std::vector(with fixed size)>的内容。我该怎么做?

2 个答案:

答案 0 :(得分:3)

由于矩阵的宽度在编译时是已知的,因此您可以使用std::array s的向量:

std::vector<std::array<int,10>> matNby10;

现在矩阵的宽度由具有固定大小的数组控制。除此之外,只要您不尝试扩展行宽,它几乎是矢量矢量的直接替代品。

此外,这种方法很可能更适合缓存,因为数组会在向量中彼此相邻存储。

答案 1 :(得分:0)

如果你需要底层的std :: vector,你可以像这样写自定义包装器:

ng lint --type-check

你最终得到了这个:

template <typename T, int N>
struct vec 
{
    vec() 
        : _c {std::vector<T>(N)}
    {
    }

    vec(int default_val) 
        : _c {std::vector<T>(N, default_val)}
    {
    }

    T const& operator[](int index) const
    {
        return _c[index];
    }

    std::vector<T>& container() { return _c; }

private:
    std::vector<T> _c;
};