我阅读了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;
答案 0 :(得分:5)
在C ++中,迭代器通常成对使用。第一个迭代器指向要考虑的第一个元素,最后一个迭代器指向要考虑的最后一个元素。这是为了简化循环:
for(it cur=first; cur!=last; cur++)
因此,lower_bound
和upper 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
点。