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++中向量的向量顺序的主要内容,如果未能解决你的问题,请参考以下文章

c++ - 按特定顺序排列向量元素

C++ 使用 iter_swap 改变向量的顺序

在 C++ 中删除向量中的第一个最小数字(并保持顺序)

在 C++ 类中引用向量

c++中向量中的元素除法

从函数 C++ 返回向量