C++"选择"算法

pis*_*hio 8 c++ algorithm lambda vector

其中中发现的功能std::algorithm我似乎无法找到最基本的,我能想到的一个:选择一个集合的子集(例如,返回所有的奇数,所有具有状态=="使用"的员工,所有物品价格低于20美元).

所以,给出一个像这样的整数列表

vector<int> ints {1, 9, 3, 27, 5, 19, 3, 8, 2, 12};

vector<int> evens = ?
vector<int> greaterThan7 = ?
Run Code Online (Sandbox Code Playgroud)

如何找到那些均匀的和那些大于7的?

Bar*_*rry 19

如果您想要更实用的功能,可以查看增强范围库.具体来说,filtered:

for (int i : ints | filtered([](int i){return i > 7;}))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个懒惰的视图,而无需构建新容器.


您可以从Eric Niebler获得相同的range-v3:

for (int i : view::filter(ints, [](int i){return i > 7;})
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处就是你可以将它分配给一个向量(所以你可以选择它是懒惰还是渴望,Boost.Ranges不允许).

std::vector<int> greaterThan7 = view::filter(ints, [](int i){return i > 7;});
std::vector<int> sameThing    = ints | view::filter([](int i){return i > 7;});
Run Code Online (Sandbox Code Playgroud)


Vla*_*cow 17

例如

vector<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; } );
Run Code Online (Sandbox Code Playgroud)

这是一个示范计划

#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;
}        
Run Code Online (Sandbox Code Playgroud)

它的输出是

8 2 12
Run Code Online (Sandbox Code Playgroud)

  • 为了公平起见,问题的示例代码也不是懒惰的.如果需要一个延迟评估的过滤器,可以在迭代器适配器中包装`std :: find_if`. (3认同)
  • 请记住,与在C#中选择或其他语言相比,这些功能并不是懒惰的,因此可能非常昂贵. (2认同)