std::find
其次是vector::erase
将从中删除第一次出现的具有给定值的对象vector
.
std::vector<int> vec{1,3,3,8,3,5};
vec.erase(std::find(vec.begin(), vec.end(), 3));
//vec == {1,3,8,3,5}
std::remove
其次是vector::erase
将删除every具有给定值的对象的出现vector
.
std::vector<int> vec{1,3,3,8,3,5};
vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end());
//vec == {1,8,5}
两者都没有更好,他们只是做不同的事情。
std::remove
更普遍有用,这就是为什么它更常见;尤其,std::remove
其次是vector::erase
当向量中不存在该元素时不执行任何操作,而std::find
其次是vector::erase
有未定义的行为。
请注意,“查找-擦除”、“删除-擦除”都保持元素的相对顺序。如果你想从向量中删除一个元素,但不关心元素的结果顺序,你可以使用“find-move-pop_back”或“partition-erase”:
//find-move-pop_back
std::vector<int> vec{1,3,3,8,3,5};
*std::find(vec.begin(), vec.end(), 3) = std::move(vec.back());
vec.pop_back();
//partition-erase
std::vector<int> vec{1,3,3,8,3,5};
vec.erase(
std::partition(vec.begin(), vec.end(), [](int v){return v != 3;}),
vec.end());