在std::vector<unsigned int>
中,我想找到元素的位置,该位置是小于某个数字的最大数字。例如:
v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
我想找一个小于8的最大数字。这个数字是7.
以下代码不正确,但这可能是我想要的。
std::vector<unsigned int>::iterator pnt = std::find_if (v.begin(), v.end(), [](const unsigned int& x) { return x < 8; && x == MAX; });
答案 0 :(得分:6)
如果您的向量始终排序,那么您可以以对数复杂度
进行排序auto it = std::lower_bound(v.begin(), v.end(), 8); // first value >= 8
auto m = *((it != v.begin())? --it : it);
如果您的矢量未分类但可以修改,则可以分两步执行:
auto it = std::partition(v.begin(), v.end(), [](int x) { x < 8 });
auto m = *(it != v.begin())? std::max_element(v.begin(), it) : it);
如果您无法修改矢量,则可以手动执行
auto max = 0;
for (elem: v) {
if (elem < 8)
m = std::max(elem, m);
}
// m is now the max of all elements < 8
两种最终方法都具有线性复杂性。后者可以通过使用filter_iterator库中的Boost.Iterator来推广,但是你已经深入到模板领域,所以只有在你重复需要这种魔法时才能这样做。
答案 1 :(得分:0)
我会创建一个函数来检查向量中是否存在任何值,如果不是,则会抛出错误。然后我会保存每个低于遇到的最大值但高于当前找到的最高值。这就是我实现它的方式。
unsigned smaller_than ( const std::vector<unsigned int>& v, unsigned max) {
bool intial_found = false;
unsigned largest;
unsigned i;
for ( i = 0; i < v.size() ;++i){
if ( v [i] < max ){
largest = v[i];
intial_found = true;
break;
}
}
if ( ! intial_found ) {
throw "oops";/*of course you make a Nice std::exception for this case*/
}
for ( ; i < v.size(); i++ ) {
if ( v[i] < max && v [i] > largest){
largest = v[i];
}
}
return largest;
}