2009-06-01 5 views
0

J'ai une question concernant l'algorithme std :: sort. Voici mon code de test:std :: tri sans foncteurs

struct MyTest 
{ 
    int m_first; 
    int m_second; 

    MyTest(int first = 0, int second = 0) : m_first(first), m_second(second) 
    { 
    } 
}; 


int main(int argc,char *argv[]) 
{ 
    std::vector<MyTest> myVec; 
    for(int i = 0; i < 10; ++i) 
    { 
     myVec.push_back(MyTest(i, i + 1)); 
    } 


    //Sort the vector in descending order on m_first without using stand alone function or functors 


    return 0; 

} 

Est-il possible de trier le vecteur sur la m_first variables sans utiliser les fonctions se tiennent seuls ou foncteurs? Aussi, s'il vous plaît noter que je n'utilise pas boost.

Répondre

10

Oui, tant que le type de valeur dans la plage à trier a un operator < qui définit une « commande faible stricte », c'est-à-dire, il peut être utilisé pour comparer deux instances MyTest correctement. Vous pourriez faire quelque chose comme:

class MyTest 
{ 
    ... 
    bool operator <(const MyTest &rhs) const 
    { 
    return m_first<rhs.m_first; 
    } 
}; 
+0

ce code C++ n'est pas valide. il faut retourner bool ou autre chose –

+0

oups fixe maintenant –

+0

merci pour la réponse..mais si à l'avenir si je veux trier m_second alors je dois fournir le foncteur. Est-ce exact? – Naveen

3

Ecrivez un opérateur < pour votre structure. C'est la fonction par défaut utilisée par tri et la manière la plus simple de lui permettre de fonctionner sur vos structures de données personnalisées.

2

Définir l'opérateur <

struct MyTest 
{ 
... 
    bool operator<(const MyTest& a_test) const { 
     return m_first < a_test.m_first; 
    } 
}; 
+0

L'opérateur ne doit prendre qu'un paramètre et comparer avec "ceci". – sth

+0

Oui, corrigé, merci! –

1

Vous devez définir un operator< dans MyTest et il devrait ressembler à ceci:

bool operator<(const MyTest &other) const { 
    return m_first < other.m_first; 
}; 
2

Il est possible de le faire avec une fonction de membre, mais la fonction autonome est le chemin à parcourir.

bool operator <(const MyTest &lhs, const MyTest &rhs) 
{ 
    return lhs.m_first<rhs.m_first; 
} 

Pourquoi ..

Scott Meyers: Comment Fonctions non membres Améliorer Encapsulation

Si vous écrivez une fonction qui peut être mis en œuvre comme soit membre ou En tant que non-membre non-ami, vous devez préférer l'implémenter en tant que fonction non-membre . Cette décision augmente encapsulation de classe. Lorsque vous pensez encapsulation, vous devriez penser non-membres fonctions.

Surprised? Read on

-2

http://ideone.com/3QLtP

Cela définit aucun opérateur <, mais ne définit foncteur.

Cependant, il est amusant de voyager à travers le temps ou le processus de compilation.