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.

Était-ce utile?

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.

     

Surpris? Lisez la suite

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

http://ideone.com/3QLtP

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top