理解下界/上界界面

时间:2017-03-30 23:34:28

标签: c++ interface lower-bound

我无法掌握下/上界限的语义。

考虑一下我写的这个测试片段:

#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吗?

2 个答案:

答案 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. http://www.cplusplus.com/reference/algorithm/lower_bound/

答案 1 :(得分:0)

下限保证它只传递key作为右手参数。

进行二分查找,查找comp(e,key)从true变为false的位置。如果comp(e,key)在特定元素e处为真,则它会搜索后面的元素,如果前面的元素为false,则直到找到“kess than”键元素之间的“edge”和元素“大于”键。它通过二进制搜索来实现:所以首先是迭代器范围的中间位置,然后是递归搜索下一个范围的中间位置。

然后它将迭代器返回到最早的元素e,使!comp(e,key)为真。

这仅适用于所有元素ecomp(e,key)位于列表的开头。