我想知道从C中向量中移除元素的最佳做法是什么 .
我见过多次使用std :: remove来查找和删除元素,然后使用erase从向量中删除元素 .
但是为什么它比使用find获取要删除的元素的迭代器然后使用该迭代器的擦除更好?
谢谢
std::find 后跟 vector::erase 将删除第一次出现的具有 vector 给定值的对象 .
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 将删除具有 vector 中给定值的对象的每次出现 .
std::remove
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-erase”,“remove-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());
1 回答
std::find
后跟vector::erase
将删除第一次出现的具有vector
给定值的对象 .std::remove
后跟vector::erase
将删除具有vector
中给定值的对象的每次出现 .两者都不是更好,他们只是做不同的事情 .
std::remove
更普遍有用,这就是为什么它更常见;特别是,std::remove
后跟vector::erase
在向量中不存在该元素时不执行任何操作,而std::find
后跟vector::erase
具有未定义的行为 .注意,“find-erase”,“remove-erase”都保持元素的相对顺序 . 如果要从向量中删除元素但不关心元素的结果顺序,可以使用“find-move-pop_back”或“partition-erase”: