c++ - 迭代插入 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::vector
andstd::list
都有其缺点。
在这种情况下,我在创建列表/向量时使用 a 会更有效std::list
,然后将其转换为 a std::vector
(例如,在这个问题中:One liner to convert from list<T> to vector<T > ) 这样我就可以利用std::vector
? 或者转换的成本是否会超过收益?
解决方案
在这种情况下,对我来说使用 std::list 会更有效吗
可能不是。这通常比直接推送到向量更昂贵。
或者转换的成本是否会超过收益?
一般来说,清单的高成本主要是问题所在。
要确定这些合理的假设是否真的正确,您应该对其进行测量。如果您测量一个明显更快,那么这可能是更有效的选择。
额外提示:不要 push_back,而是 emplace_back。根据班级的不同,这可能会更快一些。
以下是我建议测量的替代方案:
- 只是一个简单的向量和安放。
*some number*
用,shrink_to_fit
填充向量后保留向量。- 也许改用双端队列。
推荐阅读
- java - 我无法更新现有的 aws cloud front CNAME
- reactjs - 如何同时导出两个组件
- java - 射击后如何将一颗子弹分成多颗子弹
- javascript - 如何防止同一系统的多个用户生成相同的参考号
- react-native-android - 图像压缩反应原生
- google-analytics - Google Analytics 过滤器“Ashburn”在视图中不起作用
- c# - 从列表中提取值并将其保存到 C# 中的现有 Excel 工作表中
- drools - 版本从 v7.20 更改为 v7.21 后,drools 中的无限递归
- spring - Spring MVC中@ResponseBody的用例是什么
- tensorflow - 使用 Google 的 DEEPLAB V3+ 获取图像分割中每个语义类的类别概率分数