使用迭代器擦除'find'或'remove'
Erasing using iterator from 'find' or 'remove'
我想知道在c++中从向量中删除元素的最佳实践是什么。
我见过很多人使用std::remove来查找和删除元素,然后使用erase从vector中删除元素。
但是,为什么它比使用find获取要删除的元素的迭代器,然后对该迭代器使用erase更好呢?
谢谢
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::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
更普遍有用,这就是为什么它更常见的原因;特别是,当元素不存在于vector中时,std::remove
后跟vector::erase
没有任何作用,而std::find
后跟vector::erase
则没有未定义的行为。
注意"find-erase"answers"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());
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用函数"remove"删除重复元素
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 链表的泛型函数remove()与成员函数remove)
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 错误"Could not find Boost"(缺少:上下文标头)
- Qt:remove() 和 rmdir() 有什么区别
- /usr/bin/ld: cannot find -lc++
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 使用 find 解析文件会给出不同文件的奇怪结果
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- Cannot find -lglad
- "Cannot find -l<directory>"错误 - CMake
- 为什么在向量上使用 std::find() 时会出现错误?
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++ find() 在存储为变量时返回不同的值
- set::find 查找不存在的元素
- 使用迭代器擦除'find'或'remove'