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

时间:2010-12-14 18:03:46

标签: c++ vector

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

我知道我想删除第i个元素。我有int i; and std::vector<process> pList;其中process是一个结构。我想做一些与以下相同的事情:

pList.remove(i);

5 个答案:

答案 0 :(得分:80)

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

#include <algorithm>

// ...

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

对于POD,分配比交换更快,因此您应该简单地写:

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

在C ++ 11中,您可以忘记上述区别并始终使用移动语义来实现最高效率:

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 :(得分:60)

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

删除索引为i的元素。

答案 2 :(得分:10)

一种避免线性复杂性的方法!

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:3)

vector.erase(iterator)

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

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

删除第6项。