为什么C ++ lower_bound()允许返回指针等效于val,而upper_bound()则不允许

时间:2016-11-25 16:33:03

标签: c++ stl

我阅读了C ++ upper_bound()函数和lower_bound()函数的描述。有趣的是,upper_bound()只返回值为>的第一个迭代器。 val(如果未找到val,则返回[first,last]范围内的最后一个迭代器)。

实现与lower_bound()不同,它返回第一个迭代器而不是val,因此它允许返回指针等效于val。

我只是想知道以这种方式设计upper_bound()的目的是什么,upper_bound()必须不返回值等于val的迭代器?

例如:

vector<int> a = {1, 2, 3, 4};
auto i = lower_bound(a.begin(), a.end(), 2); // i is iterator at 2;
auto j = upper_bound(a.begin(), a.end(), 2); // j is iterator at 3;

http://www.cplusplus.com/reference/algorithm/lower_bound/

2 个答案:

答案 0 :(得分:5)

在C ++中,迭代器通常成对使用。第一个迭代器指向要考虑的第一个元素,最后一个迭代器指向要考虑的最后一个元素。这是为了简化循环:

for(it cur=first; cur!=last; cur++)

因此,lower_boundupper bound一起形成“所有元素的范围等于您搜索的项目。std::equal_range返回的范围相同。

答案 1 :(得分:0)

upper_bound在像std::multimap这样的情况下很有用,其中值按排序顺序存储。它允许您在{em>开始位置可以由lower_bound决定的范围内进行遍历,并且在此位置之前的upper_bound决定。

for (iter_type it = myMap.lower_bound("key_val"); it != myMap.upper_bound("key_val"); it++)

for循环将遍历到key == key_val点。