在std :: vector vs std :: insert上求助

时间:2012-06-02 10:36:58

标签: c++ performance stl stdvector erase

我有一个相对较小的排序std::vector(从5到20个元素)。 我使用std::vector因为数据是连续的所以我有速度因为缓存。 在特定点上,我需要从此vector中删除元素。

我现在有一个疑问:这是在下面两个选项中删除此值的最快方法吗?

  1. 将该元素设置为0并调用sort重新排序:这有复杂性但是 元素位于同一缓存行中。
  2. 调用erase将复制(或memcpy谁知道??)之后的所有元素 一个地方(我需要调查擦除背后的情况)。
  3. 你知道哪一个更快吗?

    我认为可以考虑使用相同的方法插入新元素而不会达到矢量的最大容量。

    此致

    AFG

1 个答案:

答案 0 :(得分:1)

如果您不关心元素的顺序,您可以将元素与最后一个元素交换。

void Remove( std::vector<Object> &vec, iterator i ) {
    iterator last = vec.end()-1;
    if (i != last)
        std::swap( *i, *last );
    vec.erase( last );
}

你提到将元素设置为0.如果这意味着你有指针,那么你可能不需要交换:

void Remove( std::vector<Object *> &vec, iterator i ) {
    vec[i] = vec.back();
    vec.erase( vec.end()-1 );
}

如果您确实关心订单,那么使用erase()的第二个选项将保留它并执行最少量的工作。它几乎肯定会比度假更快。