如何从一个std来随机删除::矢量比的std ::名单更快?
题
是怎么来的一个std ::向量随机删除比一个std ::名单更快?我在做什么,以加快它是最后的交换随机元素,然后删除最后。 我本来以为该列表会更快,因为随机删除是它是为建。
for(int i = 500; i < 600; i++){
swap(vector1[i], vector1[vector1.size()-1]);
vector1.pop_back();
}
for(int i = 0; i < 100; i++){
list1.pop_front();
}
结果(秒):结果 VEC交换删除:0.00000909461232367903结果 列表正常删除:0.00011785102105932310
解决方案
你在做什么不是随机删除,但。你从末,也就是向量为(除其他事项外)建成删除。
和交换的时候,你在做一个随机索引操作,这是也的什么载体所擅长的。
其他提示
和std::list
std::vector
之间的差别不只是向下性能。他们也有不同的迭代器失效语义。如果从std::list
删除项目,指向列表中的其他项目所有迭代器仍然有效。并非如此,std::vector
,其中删除的项无效该项目后指向所有迭代器。 (在一些实现中,他们仍然可以作为有效的迭代器,但按照标准,他们现在无法使用,以及检查落实应该如果您尝试使用它们来断言。)
所以你的容器的选择也做您所需要的语义。
这不是随机的。尝试vector1.erase(vector.begin()+兰特()%vector.size());代替。
列表erase
将导致删除的擦除列表元素,这将调用到delete
操作者的呼叫。矢量擦除只是导致交换,然后一个整数递减 - 这是快了很多
实际上,如果你想进一步速度起坐你应该经由矢量索引元件的迭代即可。他们被称为有一些架构更好的性能。
不隶属于 StackOverflow