C++ 删除向量中的第零个元素需要更多时间

C++ 删除向量中的第零个元素需要更多时间,c++,vector,stl,C++,Vector,Stl,我有一个实时问题。我用向量来解决我的问题。问题是90%的时间我都要浏览列表。5%的时间我必须将数据推回到列表中。1%的时间我必须删除。但在那个列表中,若我有超过1GB的数据,那个么删除第0个元素需要2分钟以上的时间,系统就会挂起。我如何避免它,或者任何其他标准模板库都可以解决我的问题?因此,第一个解决方案是最简单的。使用不同的数据结构。例如,一个std::deque 假设由于某种原因,std::deque无法工作。但除此之外,您还可以对元素重新排序。如果是这样,那么让我们这样做: void re

我有一个实时问题。我用向量来解决我的问题。问题是90%的时间我都要浏览列表。5%的时间我必须
将数据推回到列表中。1%的时间我必须删除。但在那个列表中,若我有超过1GB的数据,那个么删除第0个元素需要2分钟以上的时间,系统就会挂起。我如何避免它,或者任何其他标准模板库都可以解决我的问题?

因此,第一个解决方案是最简单的。使用不同的数据结构。例如,一个
std::deque

假设由于某种原因,
std::deque
无法工作。但除此之外,您还可以对元素重新排序。如果是这样,那么让我们这样做:

void remove(std::vector<T> elems, int index) {
    swap(elems[index], elems.back());
    elems.pop_back();
}
void-remove(标准::向量元素,整数索引){
交换(elems[index],elems.back());
元素pop_back();
}

以下是一些可能的解决方案:

  • 根据建议,使用
    deque
  • 如果只需要删除第一个元素,请将自己的指针指向
    向量的开始
  • 使用
    复制
    然后
    调整大小
  • #3的示例,假设我需要删除3个元素:

    replace(foo.begin(), advance(foo.begin(), 3), advance(foo.end(), -3), foo.end());
    foo.resize(foo.size() - 3);
    

    deque
    允许快速擦除第一个元素。
    列表也是如此,但开销可能太大。不过,这两种方法可能都比较慢。是的@MikeSeymour。。。但由于遍历,我需要更快的访问速度。你是遍历还是执行随机访问?@Nihar:你有没有尝试过
    deque
    ?你可能想把这一事实编辑到你的问题中,因为它在可能的解决方案中起着非常重要的作用。对于不熟悉这种技术的读者来说,这是“交换和弹出”成语。@cornstales:谢谢。我实际上不知道它有一个名称。不过请注意,每次
    推回
    (或以任何方式修改
    向量
    )时,都需要更新此指针,否则它可能是无效指针。您可能只想使用偏移量而不是指针,只需执行
    begin()+offset
    ,而不是保留实际的指针。@这是一个很好的调用。这显然是三个选项中最糟糕的一个,因为您遇到了一些严重的数据镜像问题。但是,最好的解决方案就是使用一个
    deque
    ,但它似乎是反对的。