如何在向量中找到第一个小于整数 X 的元素? (C )

新手上路,请多包涵

如果我有以下向量 {10 10 10 20 20 20 30 30} 并且我想要一个函数来返回整数的位置 = X 或直接返回 X 之后的较小元素,例如如果我正在搜索 11 我想要返回 2 的函数,因为第 2 个元素(10)是向量中第一个小于 11 的元素。

我尝试使用 lower_bound 但这不起作用。

 int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20
vector<int>::iterator low,up;

sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30

low=lower_bound (v.begin(), v.end(), 11); //
up= upper_bound (v.begin(), v.end(), 11); //

cout << "lower_bound at position " << int(low- v.begin()) << endl;
cout << "upper_bound at position " << int(up - v.begin()) << endl;

return 0;

此代码输出:

 lower_bound at position 3
upper_bound at position 3

原文由 Loers Antario 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

cppreference 告诉我 std::lower_bound

返回一个迭代器,指向范围 [first, last) 中 不小于 value 的第一个元素

std::upper_bound

返回一个迭代器,指向范围 [first, last) 中 大于 value 的第一个元素

在这种情况下,给定一个包含 10 10 10 20 20 20 30 30 的向量,我希望这两个函数都指向第一个 20 ,它位于向量中的第 3 位,并且确实是您两次得到的结果.如果您改为要求 20std::lower_bound 将返回一个迭代器,该迭代器指向第一个 20 向量中的第一个数字(位置 3…)少于 20 并且您在要求 11 时会得到相同的结果。但是,在这种情况下, std::upper_bound 将返回一个指向第一个 30 (位置 6)的迭代器,这是第一个大于 20 的值。

只需将迭代器移回一个以获得小于目标数的最后一个值, std::prev 是一种方法。

原文由 Rook 发布,翻译遵循 CC BY-SA 3.0 许可协议

那么, upper_bound 返回大于测试项目的第一个项目,那么之前的项目(如果存在)将是您想要的项目?

原文由 jcoder 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题