Используйте next_permutation для перестановки вектора классов - PullRequest
6 голосов
/ 06 июля 2010

Можно ли использовать std :: next_permutation () для перестановки элементов вектора класса, который я создал?

Как работает параметр сравнения в next_permutation ()?

Ответы [ 3 ]

10 голосов
/ 06 июля 2010

Можно ли использовать std :: next_permutation () для перестановки элементов вектора класса, который я создал?

Да!

Попробуйте это

 #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()));
 }

Как работает параметр сравнения в next_permutation ()?

Это может помочь

4 голосов
/ 06 июля 2010

Да, самый простой способ - переопределить оператор <внутри вашего класса, и в этом случае вам не нужно беспокоиться о comp.</p>

Параметр comp - это указатель на функцию, который переводит вектор в два итератора и возвращает истину или ложь в зависимости от того, как вы хотите, чтобы они были упорядочены.

Редактирование: не проверено, но того, чего стоит:

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;
}
3 голосов
/ 06 июля 2010
  1. Конечно;вам просто нужно передать итератор к первому элементу и один к элементу «один за последним», как обычно с алгоритмами STL.

  2. Это функтор, используемый для сравнения элементов вашего вектора(или контейнер в целом);он должен вести себя так, как это делает любой оператор <: вернуть true, если первый элемент меньше второго, в противном случае - false, установив таким образом отношение порядка между вашими объектами.Обратите внимание, что, как и все операторы сравнения, он должен следовать некоторым правилам (<a href="http://blogs.msdn.com/b/oldnewthing/archive/2003/10/23/55408.aspx" rel="nofollow noreferrer" title="Writing a sort comparison function - The Old New Thing"> здесь объяснено в несколько ином контексте, но они всегда одинаковы).

ByКстати, если вы определяете оператор <для своего класса, вы можете просто использовать первую перегрузку (ту, в которой в качестве параметров используются только итераторы) и избегать создания отдельного функтора. </p>

...