我无法掌握下/上界限的语义。
考虑一下我写的这个测试片段:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
// sorted vector
std::vector<std::pair<size_t, std::vector<int>>> v = {
std::make_pair(0, std::vector<int>()),
std::make_pair(0, std::vector<int>()),
std::make_pair(3, std::vector<int>()),
std::make_pair(3, std::vector<int>()),
std::make_pair(5, std::vector<int>()),
std::make_pair(20, std::vector<int>())};
auto key = 3;
auto itr = std::lower_bound(
v.begin(), v.end(), key,
[](const auto &t1, const size_t d) -> bool { return t1.first < d; });
std::cout << itr->first << "\n";
}
为什么我不需要两个向量元素?为什么我只需要d
类型的一个和第二个参数(key
)?什么是d
呢?该文档听起来像是一个转换为key
类型的向量元素。但为什么不接受另一个向量元素作为第二个参数呢?为什么没有与key
进行比较?
为什么界面看起来不像这样:
auto itr = std::lower_bound(v.begin(), v.end(), 3, [](const auto& t1, const
auto& t2) -> bool {return t1.first < t2.first;});
你能解释参数背后的语义,特别是d
吗?
答案 0 :(得分:1)
lower_bound
的第四个参数是容器中元素与键之间<
的定义。
auto itr = std::lower_bound(v.begin(), v.end(), 3, [](const auto& t1, const
auto& t2) -> bool {return t1.first < t2.first;});
有了这个,lower_bound
只知道数组中元素(即<
)之间的{int, vector<int>}
关系,但对元素和键。因此,lower_bound
找不到密钥,因为它只是不知道要比较的规则!
d
此处作为key
传递,即每次3
进行比较。它等于
auto it = std::lower_bound(
v.begin(), v.end(), key,
[key](const auto &t1, const size_t whatever) -> bool { return t1.first < key; }
);
详细了解cplusplus.com的代码。
答案 1 :(得分:0)
下限保证它只传递key
作为右手参数。
进行二分查找,查找comp(e,key)
从true变为false的位置。如果comp(e,key)
在特定元素e
处为真,则它会搜索后面的元素,如果前面的元素为false,则直到找到“kess than”键元素之间的“edge”和元素“大于”键。它通过二进制搜索来实现:所以首先是迭代器范围的中间位置,然后是递归搜索下一个范围的中间位置。
然后它将迭代器返回到最早的元素e
,使!comp(e,key)
为真。
这仅适用于所有元素e
,comp(e,key)
位于列表的开头。