为什么从std :: vector中随机删除比std :: list更快?

时间:2009-05-14 20:46:15

标签: c++ vector iterator arraylist std

为什么std :: vector的随机删除比std :: list快?我正在做的是加快速度,将随机元素与最后一个交换,然后删除最后一个元素。 我原以为列表会更快,因为随机删除就是为它构建的。

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 swap delete:0.00000909461232367903
列表正常删除:0.00011785102105932310

5 个答案:

答案 0 :(得分:17)

你所做的不是随机删除。你要从最后删除,这是为其他东西构建的向量。

交换时,你正在做一个随机的索引操作,哪些矢量擅长。

答案 1 :(得分:5)

std::liststd::vector之间的差异不仅仅取决于效果。它们还具有不同的迭代器失效语义。如果从std::list中删除项目,则指向列表中其他项目的所有迭代器仍然有效。使用std::vector不是这样,其中擦除项会使指向该项后面的所有迭代器无效。 (在某些实现中,它们仍然可以作为有效的迭代器,但根据标准,它们现在无法使用,如果您尝试使用它们,则应该断言检查实现。)

因此,您选择的容器也与您需要的语义有关。

答案 2 :(得分:0)

这不是随意的。尝试vector1.erase(vector.begin()+ rand()%vector.size());代替。

答案 3 :(得分:0)

列表erase将导致删除已删除的列表元素,这将调用对delete运算符的调用。向量擦除只会导致交换,然后是整数递减 - 这要快得多。

答案 4 :(得分:0)

实际上,如果你想进一步加速,你应该通过迭代器索引向量中的元素。众所周知,它们对某些架构具有更好的性能。