第一个元素的索引>使用 STL:: 算法转换为向量中的数字?

发布于 2025-01-04 12:40:04 字数 429 浏览 2 评论 0原文

我有一个排序的 std::vector; myvector (并且所有值都不同)。

严格查找 myvector 的第一个索引 size_t idx (不是迭代器)的值的最短方法是什么?至MAX_UI32 = 4294967295U

例如:

[1, 34, 83495, 4294967295, 4294967296, 104000000000] -> idx = 4
[1, 34, 83495, 923834, 912834823, 4294967295] -> idx = 6 (= size of myvector)

如何通过一行代码实现这一点?

非常感谢。

I have a sorted std::vector<unsigned long long int> myvector (and all values are different).

What is the shortest way to find the value of the first index size_t idx (not an iterator) of myvector strictly > to MAX_UI32 = 4294967295U.

For example :

[1, 34, 83495, 4294967295, 4294967296, 104000000000] -> idx = 4
[1, 34, 83495, 923834, 912834823, 4294967295] -> idx = 6 (= size of myvector)

How to achieve this in one line of code ?

Thank you very much.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萌︼了一个春 2025-01-11 12:40:04

upper_bounddistance 应该可以解决问题:

#include <algorithm>
#include <iterator>
#include <vector>

std::vector<unsigned long long int> v;

// ...

return std::distance(v.begin(),
                     std::upper_bound(v.begin(), v.end(), MAX_UI32));

如果没有这样的元素, upper_bound 返回 v.end(),因此您的结果将等于 v.size()

A combination of upper_bound and distance should do the trick:

#include <algorithm>
#include <iterator>
#include <vector>

std::vector<unsigned long long int> v;

// ...

return std::distance(v.begin(),
                     std::upper_bound(v.begin(), v.end(), MAX_UI32));

If there is no such element, upper_bound returns v.end(), so your result will equal v.size().

暮倦 2025-01-11 12:40:04

算法中使用upper_bound。请参阅:http://www.cplusplus.com/reference/algorithm/upper_bound/

只为一人 2025-01-11 12:40:04

只是补充一下,您可以使用 std::find_if 但在这种情况下您需要编写谓词函数:

bool IsBigger(unsigned long long int ull) {
  return (ull > MAX_UI32);
}

std::vector<unsigned long long int>::iterator it = std::find_if(v.begin(), v.end(), IsBigger);
size_t index = std::distance(v.begin(), it);

Just to add that you can use and std::find_if but in that case you need to write a predicate function:

bool IsBigger(unsigned long long int ull) {
  return (ull > MAX_UI32);
}

std::vector<unsigned long long int>::iterator it = std::find_if(v.begin(), v.end(), IsBigger);
size_t index = std::distance(v.begin(), it);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文