为啥 C++ lower_bound() 允许返回与 val 等效的指针,而 upper_bound() 不允许

Posted

技术标签:

【中文标题】为啥 C++ lower_bound() 允许返回与 val 等效的指针,而 upper_bound() 不允许【英文标题】:why C++ lower_bound() allows return pointer equivalent to val while upper_bound() does not为什么 C++ lower_bound() 允许返回与 val 等效的指针,而 upper_bound() 不允许 【发布时间】:2016-11-25 16:33:03 【问题描述】:

我阅读了 C++ upper_bound() 函数和 lower_bound() 函数的说明。对我来说有趣的是,upper_bound() 只返回 value > val 的第一个迭代器(如果没有找到 val,则返回范围 [first, last) 中的最后一个迭代器)。

实现与lower_bound()不同,它返回的第一个迭代器NOT SMALLER than 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/

【问题讨论】:

【参考方案1】:

在 C++ 中,迭代器通常成对工作。第一个迭代器指向要考虑的第一个元素,最后一个迭代器指向要考虑的最后一个元素。这是为了让循环更容易:

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

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

【讨论】:

另外,如果您将一个值插入到已排序数组的 lower_boundupper_bound 位置,则该数组将保持排序状态。【参考方案2】:

upper_bound 在像std::multimap 这样的值按排序顺序存储的情况下很有用。它允许您在 starting 位置可以由lower_bound 决定的范围内遍历,而 end-before-this-positionupper_bound 决定。

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

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

【讨论】:

以上是关于为啥 C++ lower_bound() 允许返回与 val 等效的指针,而 upper_bound() 不允许的主要内容,如果未能解决你的问题,请参考以下文章

C++ 入门(第 5 版);第 19 章 - 算法:std::lower_bound

c++中 map里upper_bound和lower_bound分别怎么理解啊? 主要是想问关键字的上界和下界是啥意思。

为啥 c++ 允许直接从子类中调用祖父类方法?

为啥 C++ 允许通过指针访问枚举?

为啥 C++ 不允许重新绑定引用?

STL