我有一个排序std::vector
。现在我需要获得满足某些条件的物品范围。例如。
vector -> 1, 4, 25, 73 450
get range that is smaller then 100 -> {1, 4, 25, 73}
如何使用std?
执行此操作答案 0 :(得分:3)
最简单的方法是使用标准算法std::lower_bound
例如
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v = { 1, 4, 25, 73, 450 };
auto last = std::lower_bound( v.begin(), v.end(), 100 );
for ( auto it = v.begin(); it != last; ++it ) std::cout << *it << ' ';
std::cout << std::endl;
return 0;
}
输出
1 4 25 73
如果要替换陈述
auto last = std::lower_bound( v.begin(), v.end(), 100 );
的
auto last = std::lower_bound( v.begin(), v.end(), 50 );
然后输出
1 4 25
依此类推。:)
答案 1 :(得分:1)
我认为你可以使用std::equal_range。只需以正确的方式定义谓词即可。请注意,您提供的示例条件符合equal_range的条件,但对于其他条件,您可能无法使用std :: equal_range。
以下是给定示例的示例谓词:
bool smaller(int a, int b) {
return (a < 100) > (b < 100);
}
这里我认为两个数字相等,如果他们以相同的方式比较100。如果他们不小于100的数字小于不小于100的数字。现在你可以打电话:
equal_range(a.begin(), a.end(), 50 /* any number < 100 */, smaller);
答案 2 :(得分:0)
听起来remove_if
或remove_if_copy
是您正在寻找的内容,例如:
std::vector<int> results;
std::remove_copy_if( original.cbegin(), original.cend(), std::back_inserter( results ),
[]( int value ) { return value < 100; } );
将实际问题放在lambda中你需要的任何东西。 (在C ++之前的版本11中,您必须使用调用remove_copy_if
的函数外部的谓词来定义函数对象,否则,原则是相同的。)