在log(n)时间内获取有序向量中的元素的迭代器。

时间:2013-07-09 16:02:27

标签: c++ c++11 stl

我有一个有序矢量,想要在其中找到一个特定的元素。我可以使用binary_search,但它只会告诉它是否存在。我还需要一个迭代器来访问该元素。有没有一种简单的方法,或者我必须按顺序搜索它。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:5)

查看lower_boundupper_boundlower_bound给第一个匹配元素提供迭代器,而upper_bound给迭代器提供一个超过最后一个匹配元素。

如果任一算法未能找到匹配项,它会将迭代器返回到可以插入项目的位置以维护已排序的容器。

我一直觉得binary_search被误导了。

答案 1 :(得分:1)

std::lower_bound将返回小于您的值的第一个元素。如果返回的元素等于您的值,则表示如果 不等于 ,或者结束迭代器未找到正确的元素。

以下是dupe

中的代码
template<class Iter, class T>
Iter binary_find(Iter begin, Iter end, T val)
{
    // Finds the lower bound in at most log(last - first) + 1 comparisons
    Iter i = std::lower_bound(begin, end, val);

    if (i != end && !(val < *i))
        return i; // found
    else
        return end; // not found
}

请记住,如果您使用std::upper_bound而不是返回第一个 更高 元素,那么就不容易适应您的目的,因为如果您的元素确实存在发现你必须减少迭代器,即便如此你仍然可能找不到它