2010-07-06 11 views

risposta

8

È possibile utilizzare std :: next_permutation() per permutare gli elementi di un vettore di una classe che ho creato?

Sì!

Prova questa

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

Come funziona il parametro di confronto in next_permutation() funziona?

This potrebbe aiutare

+0

Grazie per la risposta, ma forse non ero abbastanza esplicito. Diciamo che ho una classe con diversi proprieta 'e non necessariamente Ints. Devo sovraccaricare gli operatori di confronto della classe per il vettore da permutare? – jmclem

+2

Nella maggior parte dei casi, sì. –

+0

@PrasoonSaurav, cosa succede se i duplicati esistono? next_permutation() salterà automaticamente la stessa permutazione? – city

4

Sì, il modo più semplice è quello di ignorare l'operatore < all'interno della classe, nel qual caso non è necessario preoccuparsi di comp.

Il parametro comp è un puntatore a funzione che accetta due iteratori sul vettore e restituisce true o false a seconda di come li si desidera ordinare.

Edit: Non testato, ma per quello che vale:

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; 
} 
+0

Perché il voto verso il basso? – Patrick

+0

Non so, non ero io, non ho nemmeno un account ... Grazie per la risposta però – jmclem

3
  1. Sicuro; è sufficiente passare un iteratore al primo elemento e uno all'elemento dell'ultimo penultimo, come al solito con gli algoritmi STL.

  2. È un functor utilizzato per confrontare elementi del vettore (o contenitore in generale); dovrebbe comportarsi come farebbe qualsiasi operatore <: restituisce true se il primo elemento è inferiore al secondo, falso altrimenti, stabilendo così una relazione di ordine tra gli oggetti. Si noti che, come tutti gli operatori di confronto, deve seguire alcune regole (here spiegate in un contesto leggermente diverso, ma sono sempre le stesse).

A proposito, se si definisce un operatore di < per la classe si può semplicemente utilizzare il primo overload (quella con solo gli iteratori come parametri) ed evitare di creare un funtore separata.

Problemi correlati