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.surestd::array
在C++11之前不可用,因此OP无论如何都无法将此解决方案与旧的编译器一起使用。
std::vector<vec<int,10>> asd;