Remove ith item from a C++ std::vector
本问题已经有最佳答案,请猛点这里访问。
如何从
我知道我想删除第i个元素。我有
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项。