如何在排序向量中找到值(C ++)

时间:2016-01-07 14:34:54

标签: c++ vector

我已经搜索了我的问题的解决方案,但没有找到答案。以下代码仅用于学习目的。我想在此向量中擦除值为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?

非常感谢您的帮助!

3 个答案:

答案 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'确实被删除了。