Filter in c++ mit Lambda nutzen

Filter werden benutzt, um Operationen auf einer großen Datenmenge auszuführen. In diesem Beispiel ist die Datenmenge allerdings überschaubar. Zunächst wird jedes Element modifiziert (map), dann ein Filter angewendet, um die Menge zu verkleinern. Abschließend folgt eine Reduzierung, bis nur noch ein Element übrig bleibt. Ein Anwendungsfall wären Streams.

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

auto map = [](int &elem) -> int {return elem-1;};
auto filter = [](int &elem) -> bool {return elem % 2 == 0 || elem <= 0;};
auto reduce = [](int &x, int &y) -> int {return x*y;};

int main(){
    std::vector<int> origin{-3,-2,-1,0,1,2,3,4,5,6,7,8,9};
    std::vector<int> afterMap;

    // map: do something with all elements in this datastructure
    std::transform(origin.begin(), origin.end(), std::back_inserter(afterMap), map);

    // filter: conditions to skip elements
    std::vector<int>::iterator vectorfilter = std::remove_if(afterMap.begin(), afterMap.end(), filter);

    for(auto it = afterMap.begin(); it != vectorfilter; it++){
        std::cout << *it << '\n';
    };

    // reduce: to reduce elements in this container via sum, multiply or other things
    int result = std::accumulate(afterMap.begin(), vectorfilter, afterMap[0], reduce);
    std::cout << result << '\n';
}

cpp_filter.png



0
0
0.000
4 comments