Search code examples
c++c++11filterstdstdvector

What is a modern way to filter a container?


I was wondering what the modern - read: C++11 - way of filtering an array would be, i.e. how can we achieve something similar to this C# Linq query:

var filteredElements = elements.Where(elm => elm.filterProperty == true);

In order to filter a vector of elements (strings for the sake of this question)?

I sincerely hope the old STL-style algorithms (or even extensions like boost::filter_iterator) requiring explicit methods to be defined are superseded by now?


Solution

  • See the example from cplusplus.com for std::copy_if:

    std::vector<int> foo = {25,15,5,-5,-15};
    std::vector<int> bar;
    
    // copy only positive numbers:
    std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), [](int i){return i>=0;} );
    

    std::copy_if evaluates the lambda expression for every element in foo here and if it returns true it copies the value to bar.

    The std::back_inserter allows us to actually insert new elements at the end of bar (using push_back()) with an iterator without having to resize it to the required size first.