0

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

我现在有一个疑问:在下面的两个选项之间删除这个值的最快方法是什么?

  1. 将该元素设置为 0 并调用sort重新排序:这具有复杂性,但元素位于同一缓存行上。
  2. 调用erase它将复制(或 memcpy 谁知道??)它之后的所有元素(我需要调查擦除的幕后)。

你知道哪个更快吗?

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

问候

AFG

4

1 回答 1

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() 的第二个选项将保留它并做最少的工作。它几乎肯定会比诉诸更快。

于 2012-06-06T18:25:03.453 回答