【发布时间】:2020-09-17 21:30:08
【问题描述】:
我想删除所有大于 4 的元素,这个程序打印:4 3 1 8 1 并且不正确
std::vector<int> arr1 = { 4, 6, 3, 8, 1 };
std::remove_if(arr1.begin(), arr1.end(), [](int i) {return i>4; });
print(arr1);
我做错了什么?
【问题讨论】:
我想删除所有大于 4 的元素,这个程序打印:4 3 1 8 1 并且不正确
std::vector<int> arr1 = { 4, 6, 3, 8, 1 };
std::remove_if(arr1.begin(), arr1.end(), [](int i) {return i>4; });
print(arr1);
我做错了什么?
【问题讨论】:
std::remove_if 实际上并没有删除任何元素。它只将要保留的元素移动到vector 的前面,并将迭代器返回到要删除的第一个元素。 (这适用于任何连续的容器,而不仅仅是vector)。
然后您需要从该迭代器调用std::vector::erase 到vector 的end 以实际擦除已从arr1 中删除的元素:
auto last = std::remove_if(arr1.begin(), arr1.end(), [](int i) {return i>4; });
arr.erase(last, arr.end());
【讨论】:
[arr.begin(), last) 之后的任何内容都是垃圾。