在 std::algorithm
中,我似乎找不到一个我认为最基本的功能之一:选择集合的子集(例如,返回所有奇数、所有状态为'employed'的员工、所有价格低于20美元的商品)。
因此,假设有一个像这样的整数列表:
vector<int> ints {1, 9, 3, 27, 5, 19, 3, 8, 2, 12};
vector<int> evens = ?
vector<int> greaterThan7 = ?
如何找到那些偶数并且大于7的数字?
如果您想要更多功能,可以查看boost range库。具体而言,请查看filtered
:
for (int i : ints | filtered([](int i){return i > 7;}))
{
...
}
这为您提供了一种懒惰视图,而无需构建新容器。
您可以从Eric Niebler的range-v3
中获得相同的结果:
for (int i : view::filter(ints, [](int i){return i > 7;})
{
...
}
有一个好处是你也可以将其分配给向量(所以你可以选择是惰性或急切的,这是Boost.Range不允许的)。
std::vector<int> greaterThan7 = view::filter(ints, [](int i){return i > 7;});
std::vector<int> sameThing = ints | view::filter([](int i){return i > 7;});
sameThing
。 - NathanOlivervector<int> ints {1, 9, 3, 27, 5, 19, 3, 8, 2, 12};
vector<int> evens;
std::copy_if( ints.begin(), ints.end(), std::back_inserter( evens ),
[]( int x ) { return x % 2 == 0; } );
这是一个演示程序
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> ints { 1, 9, 3, 27, 5, 19, 3, 8, 2, 12 };
std::vector<int> evens;
std::copy_if( ints.begin(), ints.end(), std::back_inserter( evens ),
[]( int x ) { return x % 2 == 0; } );
for ( int x : evens ) std::cout << x << ' ';
std::cout << std::endl;
}
它的输出是
8 2 12
std::find_if
包装在迭代器适配器中。 - Useless根据你的具体需求,考虑使用 std::stable_partition
(或 std::partition
)。它会重新排序范围内的元素,使所有满足谓词的元素都排在前面。你可以将其视为将范围分成“子集”和“非子集”两部分。以下是一个示例:
#include <algorithm>
#include <vector>
#include <iostream>
int main()
{
using std::begin;
using std::end;
using std::cbegin;
using std::cend;
std::vector<int> ints { 1, 9, 3, 27, 5, 19, 3, 8, 2, 12 };
auto const greater_than_7 = [](int number) { return number > 7; };
auto const iter_first_not_greater_than_7 = std::stable_partition(begin(ints), end(ints), greater_than_7);
for (auto const_iter = cbegin(ints); const_iter != iter_first_not_greater_than_7; ++const_iter)
{
std::cout << *const_iter << "\n";
}
}
然而,如果您愿意将每个匹配的元素复制到新集合中,例如因为源范围不得修改,则使用std::copy_if
。
std::stable_partition
。 - erip
std::copy_if
不适用于您吗? - NathanOliverstd::algorithm
这个东西是不存在的。你可能想要写的是<algorithm>
。 - Christian Hackl