我有一个有序矢量,想要在其中找到一个特定的元素。我可以使用binary_search
,但它只会告诉它是否存在。我还需要一个迭代器来访问该元素。有没有一种简单的方法,或者我必须按顺序搜索它。
任何帮助表示感谢。
答案 0 :(得分:5)
查看lower_bound
和upper_bound
。 lower_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
而不是返回第一个 更高 元素,那么就不容易适应您的目的,因为如果您的元素确实存在发现你必须减少迭代器,即便如此你仍然可能找不到它