Search code examples
c++algorithmtemplatesc++11predicate

how to pass a predicate to algorithm


I'm having a problem passing predicate using lambda, I'm trying to move element that matches the predicate to the beginning of a second container, but it didn't seem to work, so what's wrong please?

#include <iostream>
#include <vector>
#include <list>
#include <iterator>
#include <utility>
#include <algorithm>


using namespace std;

    template <typename iterator, typename Container, typename T>
    void move_if(iterator b, iterator e, Container o, T pred)
    {
        if(pred)
        {
            o.insert(o.begin(),pred);
        }

    }


    int main()
    {
        vector<int>v{1,2,3,4,5,6,7,8,9,10};
        vector<int>v2;
        for (auto i=v.begin(); i !=v.end(); ++i)
            save_if(v.begin(), v.end(), v2, []( vector<int>::iterator i){return (*i>5);});

        return 0;

    }

Solution

  • Check this out, I did some modifications on your code:

    template <typename iterator, typename Container, typename T>
    void move_if(iterator a, iterator b, Container &o, T pred)
    {
        for (auto i = a; i != b; i++)
        {
            if (pred(*i))
                o.insert(o.begin(), *i);
        }
    }
    
    int main()
    {
        vector<int>v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        vector<int>v2;
    
        move_if(v.begin(), v.end(), v2, [](int i) { return !(i > 5); });
    }
    

    Note: As the comments, It's recommended to rename move_if to copy_if, if the functionality is as above code, otherwise you should really move items.