我已经搜索了我的问题的解决方案,但没有找到答案。以下代码仅用于学习目的。我想在此向量中擦除值为3的所有元素:
std::vector<int> v{1,1,2,2,2,3,3,4,4};
我试图像这样解决它:
//只是代码的摘录
iterator erase(T const& elem) {
return v.erase(std::remove(v.begin(), v.end(), elem), v.end());
}
但在我的测试用例中,我希望迭代器指向值4,但在我的代码中它指向值3.它只从我的向量中移除前3个。
如何删除两个值&#34; 3&#34;,以便迭代器返回指向4?
非常感谢您的帮助!
答案 0 :(得分:5)
您的代码按预期工作:
std::vector<int> v{1,1,2,2,2,3,3,4,4};
auto it = erase(3)
assert(v == std::vector<int>({1,1,2,2,2,4,4});
assert(*it == 4);
返回的迭代器指向已移除的最后一个元素。
您只是错误地解释了vector::erase
的返回值。
答案 1 :(得分:2)
虽然std::remove
可行,但它没有利用容器已排序的事实。为此,您需要找到包含所有目标值的范围。像这样:
#include <algorithm>
#include <vector>
void remove(std::vector<int>& vec, int value) {
auto lb = std::lower_bound(vec.begin(), vec.end(), value);
auto ub = std::upper_bound(vec.begin(), vec.end(), value);
vec.erase(lb, ub);
}
答案 2 :(得分:0)
你做的一切都是正确的。 请注意,返回的指针只是指向新的'end',因此您正在查看已释放的内存。
如果您只是看向量v,您会注意到所有'3'确实被删除了。