目录
结论
- std::remove并没有删除元素,只是将指定元素交换到了容器后面
- 删除元素需要配合erase完成
实现过程
- 代码
// 演示代码
std::vector<int> ids{ 1, 3, 5, 3, 7 }; // 1 3 5 3 7
auto tar = std::remove(ids.begin(), ids.end(), 3); // 1 5 7 3 7
// 实现代码
template <class _FwdIt, class _Pr>
_NODISCARD _CONSTEXPR20 _FwdIt remove_if(_FwdIt _First, const _FwdIt _Last, _Pr _Pred) {
// remove each satisfying _Pred
_Adl_verify_range(_First, _Last);
auto _UFirst = _Get_unwrapped(_First);
const auto _ULast = _Get_unwrapped(_Last);
_UFirst = _STD find_if(_UFirst, _ULast, _Pass_fn(_Pred));
auto _UNext = _UFirst;
if (_UFirst != _ULast) {
while (++_UFirst != _ULast) {
if (!_Pred(*_UFirst)) {
*_UNext = _STD move(*_UFirst);
++_UNext;
}
}
}
_Seek_wrapped(_First, _UNext);
return _First;
}
- 解析
step1: 1 3 5 3 7 // 原始数据
step2: _UFirst = 1 _UNext = 1
step3: 1 5 5 3 7 // 5 != 3 将5向前拷贝到3
step4: 1 5 5 3 7 // 3 == 3 保持不动
step5: 1 5 7 3 7 // 7 != 3 将7向前拷贝到5
step6: swap _First _UNext得到可以删除的迭代器,该迭代器后面所有元素可以删除
注意事项
- remove后指定元素并没有被删除
- remove后最后元素内容发生变化
- 删除元素需要配合erase完成
std::vector<int> ids{ 1,3,5, 3, 7 };
auto tar = std::remove(ids.begin(), ids.end(), 3);
ids.erase(tar, ids.end());
标签:std,ids,remove,First,UFirst,并非,UNext
From: https://www.cnblogs.com/faithlocus/p/16739382.html