Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们能用std::vector定义一个固定宽度的二维矩阵吗?_C++_C++11_Vector - Fatal编程技术网

C++ 我们能用std::vector定义一个固定宽度的二维矩阵吗?

C++ 我们能用std::vector定义一个固定宽度的二维矩阵吗?,c++,c++11,vector,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)); std::向量abc; abc.push_-back(std::vector(9,0)); ab

我用下面的例子来说明我的问题:

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));
std::向量abc;
abc.push_-back(std::vector(9,0));
abc.push_-back(std::vector(9,2));
...
abc.push_-back(std::vector(9,20));

从示例中可以看出,每次将向量放入2D向量时,其维度都是相同的。变量
abc
表示固定宽度的矩阵,其高度可根据需要增减。因此,我想定义类似于
std::vector
的东西。我怎么做

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

std::vector matNby10;
现在矩阵的宽度由具有固定大小的数组控制。除此之外,只要您不尝试扩展行宽度,它几乎可以替代向量向量


此外,这种方法很有可能对缓存更友好,因为数组将在向量中彼此相邻地存储。

如果需要底层std::vector,可以编写如下自定义包装器:

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;
};
模板
结构向量
{
vec()
:_c{std::vector(N)}
{
}
向量(整数默认值)
:_c{std::vector(N,默认值)}
{
}
T常量和运算符[](整数索引)常量
{
返回c[索引];
}
std::vector&container(){return}
私人:
std::vector_c;
};
你最终会得到这样的结果:

std::vector<vec<int,10>> asd;
std::向量asd;

编译时是否有固定大小的
可用?@dasblinkenlight是的,它可用。在“>>中应该有一个空格。它应该是
std::vector matNby10。否则你会得到一个.@athul.当然这是真的,但前提是你使用的是古老的编译器。从C++11开始,需要使用语言分析器来正确处理这种情况。True。但请在回答中具体说明。如果您在g++中编译上述代码时没有
std
标志,您将得到一个错误。@athul.sure
std::array
在C++11之前不可用,因此OP无论如何都无法将此解决方案与旧的编译器一起使用。
std::vector<vec<int,10>> asd;