- 一种方法是编写一个函数,该函数作为std :: vector返回所需行或列的副本。
- 另一种方法是将整个内容作为引用传递,并修改函数以能够读取所需的值。
vector<vector<...>>
的分配、释放和访问速度都很慢,因为它有多个解除引用(不适合缓存)。
我建议只在你的行或列大小不相同时(锯齿状数组)使用它。
对于“正常”的矩阵,你可以选择类似以下的东西:
template <class T, size_t nDim> struct tensor {
size_t dims[nDim];
vector<T> vect;
};
重载operator(size_t i, size_t j, etc.)
以访问元素。
operator()
将必须进行索引计算(您必须在行主序或列主序之间进行选择)。对于nDim > 2
,它变得有些复杂,可以从缓存一些索引计算中获益。
要返回行或列,您可以定义子类型。
template <class T, size_t nDim> struct row /*or column*/ {
tensor<T, nDim> & tensor;
size_t iStart;
size_t stride;
}
然后定义一个operator(size_t i)
,它将返回tensor.vect[iStart + i*stride]
stride
的值取决于它是行还是列以及您的(行主或列主)顺序选择。
对于其中一个子类型,stride
将为1。请注意,对于此子类型,迭代可能会快得多,因为它将具有良好的缓存友好性。对于其他子类型,不幸的是,迭代可能会相当慢,并且您无法做太多事情来改变它。
请参阅其他SO问题,了解为什么按行然后按列迭代与按列然后按行迭代可能会有巨大的性能差异。
我建议您通过引用传递它,因为复制可能会根据大小而变得缓慢。如果您想要扩展和收缩容器的能力,std::vector是可以的。
E operator()(row,column)
。 - user2249683vector<vector<double>>
,那么您可以传递对行的引用(即vector<double>&
)。 - 463035818_is_not_a_number