为什么lower_bound会给出不在集合中的值?

时间:2015-02-01 13:16:46

标签: c++

为什么设置0的lower_bound(2) 给出1作为结果

set<int> S;
S.insert(0);
cout<<*(S.lower_bound(2))<<endl;

我认为它应该返回集合

中的一些元素

2 个答案:

答案 0 :(得分:5)

lower_bound返回一个迭代器。如果您要求的值不存在,它将返回一个迭代器,您可以将其作为insert参数传递给hint(并获得常量复杂性插入),这意味着迭代器引用元素在您要求搜索的值之后立即排序。

当您传递的值大于集合中的任何值时,它将返回容器的.end()迭代器。尝试取消引用结束迭代器会产生未定义的行为 - 它不会引用任何实际元素。

答案 1 :(得分:4)

来自the documentation

iterator lower_bound( const Key& key );
     

返回一个指向第一个元素的迭代器,该元素不小于而不是键。

你的套装如下:

std::set<int> s {0};

因此没有不小于的元素。因此s.lower_bound(2)会返回s.end()。取消引用迭代器会调用未定义的行为,在您的情况下,恰好会给您1。