我有一个排序std::vector<unsigned long long int> 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)
如何在一行代码中实现这一目标?
非常感谢。
答案 0 :(得分:3)
upper_bound
和distance
的组合应该可以解决问题:
#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()
。
答案 1 :(得分:2)
在upper_bound
中使用algorithm
。请参阅:http://www.cplusplus.com/reference/algorithm/upper_bound/
答案 2 :(得分:0)
添加你可以使用和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);