【问题标题】:lower_bound/upper_bound on unsorted vector未排序向量上的 lower_bound/upper_bound
【发布时间】:2018-08-02 08:06:51
【问题描述】:
const std::vector<int> v = {5, 7, 3, 6, 5, 4, 7, 8, 5, 6};

auto low = std::lower_bound( v.begin(), v.end(), 7);
auto high = std::upper_bound( v.begin(), v.end(), 7);
std::cout << low - v.begin() << " " << high - v.begin();

所以当我尝试在我的 Mac 上使用 clang++ 编译器编译这段代码时,它会返回输出为

10 10

这意味着v.end() 表示高和低,尽管低应该是 = 1 和高 =7(数字 8)。我做错了什么?

【问题讨论】:

  • 请注意,std::upper_boundstd::lower_bound 都要求范围“至少部分排序”。
  • 这些函数只适用于排序数据。
  • @Someprogrammerdude 只是出于兴趣,这个问题到底有什么问题?对我来说,这似乎是“最小的”、“完整的”和“可验证的”。
  • @AliAlamiri 我们基本上应该能够复制粘贴代码并复制输出,而无需任何努力“修复”事物。这包括诸如头文件和main 函数之类的东西。输出也应该作为文本复制粘贴,而不仅仅是与文本的其余部分混合。我们还应该看到 expected 输出,格式与实际输出相同。这在我提供的链接中都有详细说明。

标签: c++ stl


【解决方案1】:

std::lower_boundstd::upper_bound 要求范围是“排序的”(实际上根据谓词和给定值进行分区),这不是您的情况。

【讨论】:

  • 你能告诉我upper_bound和lower_bound的机制吗,我的意思是他们使用二进制搜索还是什么?
  • @TheSYNcoder 了解upper_bound和lower_bound的机制可以参考以下链接:upper_bound,lower_bound
  • @TheSYNcoder: std::lower_bound 可以用std::partition_point 实现。它确实做了一些二分搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多