Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use next_permutation to permutate a vector of classes

Is it possible to use std::next_permutation() to permutate the elements of a vector of a class i created?

How does the comparison parameter in next_permutation() work?

like image 288
jmclem Avatar asked Jul 06 '10 09:07

jmclem


2 Answers

Is it possible to use std::next_permutation() to permutate the elements of a vector of a class i created?

Yes!

Try this

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

int main()
 {
      typedef std::vector<int> V; //<or_any_class>
      V v;

      for(int i=1;i<=5;++i)
        v.push_back(i*10);
      do{
            std::cout<<v[0]<<" "<<v[1]<<" "<<v[2]<<" "<<v[3]<<" "<<v[4]<<std::endl;;
        }

       while(std::next_permutation(v.begin(),v.end()));
 }

How does the comparison parameter in next_permutation() work?

This might help

like image 65
Prasoon Saurav Avatar answered Sep 23 '22 18:09

Prasoon Saurav


Yes, the simplest way is to override operator< within your class in which case you don't need to worry about comp.

The comp parameter is a function pointer which takes two iterators to the vector and returns true or false depending on how you'd want them ordered.

Edit: Untested but for what it's worth:

class myclass
{
public:
    myclass() : m_a( 0 ){}
    void operator = ( int a ) { m_a = a; }

private:
    friend bool operator<( const myclass& lhs, const myclass& rhs ) { return lhs.m_a < rhs.m_a; }
    int m_a;
};

int _tmain(int argc, _TCHAR* argv[])
{
    myclass c;  
    std::vector<myclass> vec;

    for( int i = 0; i < 10; ++i )
    {
        c = i;
        vec.push_back( c );
    }

    //these two should perform the same given the same input vector
    std::next_permutation( vec.begin(), vec.end() );    
    std::next_permutation( vec.begin(), vec.end(), &operator< );

    return 0;
}
like image 21
Patrick Avatar answered Sep 23 '22 18:09

Patrick