从C ++ std :: vector中删除第i项

Remove ith item from a C++ std::vector

本问题已经有最佳答案,请猛点这里访问。

如何从std::vector中删除第i项?

我知道我想删除第i个元素。我有int i; and std::vector pList;,其中process是一个结构。我想做的事情相当于:

1
pList.remove(i);

这里有一个O(1)解决方案,假设您不关心元素的顺序:

1
2
3
4
5
6
7
8
9
#include

// ...

{
    using std::swap;
    swap(pList[i], pList.back());
    pList.pop_back();
}

对于pods,分配比交换更快,因此您只需编写:

1
2
pList[i] = pList.back();
pList.pop_back();

在C++ 11中,你可以忘记上面的区别,并且总是使用移动语义来获得最大的效率:

1
2
3
4
5
6
7
if (i != pList.size() - 1)
{
    // Beware of move assignment to self
    // see http://stackoverflow.com/questions/13127455/
    pList[i] = std::move(pList.back());
}
pList.pop_back();


1
pList.erase(pList.begin()+i);

删除带索引i的元素。


从线性复杂性中拯救自己的方法!

由于vector.erase()是线性复杂度,我建议您只需将第i个元素与最后一个元素交换,然后在末尾删除元素(实际上是第i个元素);这样,您就可以避免线性复杂度。这就是我的想法!


使用vector.erase。复杂度与删除的元素数(析构函数)加上最后一个元素删除(移动)后的元素数呈线性关系。

1
2
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );


1
vector.erase(iterator)

其中迭代器是位置。可以使用vector.begin()获取第一个元素,使用vector.end()获取最后一个元素。只需添加到迭代器中就可以得到所需的元素。例如。:

1
pList.erase(pList.begin()+6);

删除第6项。