首页 > 解决方案 > 迭代插入 std::list 然后转换为 std::vector 以进行随机访问?

问题描述

假设我有一种情况,我正在迭代地填充向量/列表,但我不知道事先会有多少元素。例如,代码可能看起来或多或少像这样:

std::vector<MyClass> mythings;
for(int i = 0; i < *some number*; ++i){
    if(*some condition here*){
        mythings.push_back(MyClass());
    }
}

我知道push_back当用于std::vector. 因此,在上面的代码块中,我可以更改mythings为 a std::list,并且可能会更快,因为std::list它是作为链表实现的。但是,假设我知道我需要对刚刚创建的列表/向量进行随机访问。对于随机访问,std::vector会快得多。因此,在这种情况下使用std::vectorandstd::list都有其缺点。

在这种情况下,我在创建列表/向量时使用 a 会更有效std::list,然后将其转换为 a std::vector(例如,在这个问题中:One liner to convert from list<T> to vector<T > ) 这样我就可以利用std::vector? 或者转换的成本是否会超过收益?

标签: c++listvector

解决方案


在这种情况下,对我来说使用 std::list 会更有效吗

可能不是。这通常比直接推送到向量更昂贵。

或者转换的成本是否会超过收益?

一般来说,清单的高成本主要是问题所在。


要确定这些合理的假设是否真的正确,您应该对其进行测量。如果您测量一个明显更快,那么这可能是更有效的选择。

额外提示:不要 push_back,而是 emplace_back。根据班级的不同,这可能会更快一些。

以下是我建议测量的替代方案:

  • 只是一个简单的向量和安放。
  • *some number*用,shrink_to_fit填充向量后保留向量。
  • 也许改用双端队列。

推荐阅读