【问题标题】:resort on a std::vector vs std::insert诉诸 std::vector 与 std::insert
【发布时间】:2012-06-07 08:44:55
【问题描述】:

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

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

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

你知道哪个更快吗?

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

问候

AFG

【问题讨论】:

  • 你为什么不测量并找出来?
  • 另外,我看不出排序(涉及复制)如何比复制更快。
  • ...容器元素的类型也很重要。
  • 您正在对缓存行等进行假设,但我认为您最好在现实条件下对其进行分析。
  • 为什么不使用符合这种模式的东西,比如有序地图?他们自动处理这些东西,在这些大小上,底层树的开销可以忽略不计。

标签: c++ performance stl stdvector erase


【解决方案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() 的第二个选项将保留它并做最少的工作。几乎可以肯定,它会比求助更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2012-09-11
    • 2013-10-07
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多