C++中向量的向量顺序
Posted
技术标签:
【中文标题】C++中向量的向量顺序【英文标题】:Which order for vector of vector in C++ 【发布时间】:2020-05-01 14:51:37 【问题描述】:我正在使用结构 std::vector< std::vector<double> >
将二维数据存储在大小为 NxM 的 C++ 代码中。如果 N 与 M 非常不同,是否存在与我存储数据的顺序相关的性能问题?
例如,假设 N = 3 和 M = 100000,我想构建 3 个大小为 100000 的向量比构建 100000 个大小为 3 的向量要快。但例如,如果我使用大量 push_back
来填充它们(假设我不知道初始大小),另一种方法不是更快吗?
【问题讨论】:
如果您关心性能,更好的决定可能是只使用一个std::vector
和一些索引算法。
我猜这是一个矩阵,或者至少是等价的。为此,只需做一些研究,寻找有效的实现和/或讨论有关该主题的此处。
@Evg 这绝对是一个更好的主意,但它只有在至少知道 N or M 时才有效。我假设OP想要存储例如N = 3 但 M 未知的坐标,在这种情况下,您的建议会起作用(只要您不仅迭代 x 坐标,您就可以使用缓存等)。
我实际上只知道一个坐标,(在运行时)。我确实可以使用单个向量,但是一旦构建了向量,我就会在两个维度上使用方法,这就是为什么我想出向量的向量,以避免之后的算术运算。不过我不确定这是否有问题。
【参考方案1】:
我想构建 3 个大小为 100000 的向量比 100000 更快 大小为 3 的向量。
几乎可以肯定,是的(相当如此)!
...如果我使用大量 push_back 来填充它们(假设我没有 知道初始大小)。
如果您至少知道(或怀疑)最大尺寸可能是多少,您可以在循环之前使用 reserve(nMax)
函数和 push_back
调用,然后调用 @987654322 @ 之后,释放不需要的内存。这种方法将减少由(可能很多)重新分配调用引起的开销。
【讨论】:
以上是关于C++中向量的向量顺序的主要内容,如果未能解决你的问题,请参考以下文章