在修改序列时迭代序列.使用矢量或列表?C++/STL

smi*_*dha 0 c++ algorithm stl

假设我有一个长序列的无序元素S s1, s2, s3,....,它是一个任意但固定的数据类型,我希望根据一些布尔标准迭代并删除某些元素.

现在如果我在迭代序列之后如果我对序列的最终排序感兴趣,那么我可以用两种方式存储我的序列

  1. 使用普通的ol' std::list来表示序列.使用std :: list方法执行删除.
  2. 使用a std::vector表示序列.如果某个元素未通过该标准并且必须删除,则将其与最后一个向量元素交换并执行pop_back.

我的问题是

1.以时间和/或记忆方式存储序列的更好/更有效的方法是什么?

2.如果我不得不猜测,那么我会说列表,因为如果si数据类型的内存大小很大,交换会很昂贵.这种推理是否正确?

Ker*_* SB 5

实际上,std::vector由于其紧密的内存局部性,与其他容器相比具有很大的性能优势.如果你的元素更可移动(即交换成本低廉),那么你的第二个选择应该是你的第一次尝试.使用标准的删除/擦除习惯用法实现它:

v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end());
Run Code Online (Sandbox Code Playgroud)

您还应该设置第二个版本,std::list并比较性能:

l.remove_if(predicate);
Run Code Online (Sandbox Code Playgroud)

该列表避免移动任何元素,因此理论上它可能是有效的,但是内存局部性的实际效果不能被语言标准捕获,并且您无法绕过测量和比较实际性能.

(据说,如果你的元素类型很大,sizeof(T) > 10000那么列表可能会比矢量更快.测试和比较,并保持你的代码模块化,以便稍后更改它很容易.)