std :: sort sans foncteurs
Question
J'ai une question concernant l'algorithme std :: sort. Voici mon code de test:
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 autonomes ou foncteurs? En outre, s'il vous plaît noter que je ne suis pas en utilisant boost.
La solution
Oui, tant que le type de valeur dans la plage à trier a un operator <
qui définit un « ordre strict faible », c'est-à-dire qu'il peut être utilisé pour comparer correctement deux instances de MyTest
. Vous pourriez faire quelque chose comme:
class MyTest
{
...
bool operator <(const MyTest &rhs) const
{
return m_first<rhs.m_first;
}
};
Autres conseils
Ecrire un opérateur
Définir l'opérateur <
struct MyTest
{
...
bool operator<(const MyTest& a_test) const {
return m_first < a_test.m_first;
}
};
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 oeuvre soit comme un élément ou en tant que non-membre non-ami, vous devriez préfèrent mettre en œuvre en tant que membre non une fonction. Cette décision augmente encapsulation de classe. Quand tu penses encapsulation, vous devriez penser les fonctions non-membres.
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;
};
Ceci définit aucun opérateur <, mais ne définit foncteur.
Cependant, il est amusant de voyager dans le temps ou le processus de compilation.