Duplikate entfernen, operator < überladen



  • Ich will mit folgendem Code Duplikate entfernen:

    template<typename T>
        void removeDuplicates(std::vector<T>& vec)
        {
            std::sort(vec.begin(), vec.end());
            vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
        }
    

    Wie muss ich dafür meine Klasse, die einen double[3] kapselt, den Operator < (odr <=?) überladen, damit die lexikographische Ordnung genommen wird?=





  • krümelkacker schrieb:

    RTFM

    Sorry, ich dachte, es ging um das, was std::unique braucht, um Duplikate rauszuschmeißen. std::sort wäre mit einem entsprechenden operator< zufrieden.

    Du gehst einfach der Reihe nach vom ersten bis zum letzten Element und vergleichst die so lange, bis eines größer oder kleiner ist.

    ungetesteter Pseudocode

    bool operator<(dings const& a, dings const& b)
    {
      for (int k=0; k<3; ++k) {
        if (a.array[k] != b.array[k])
          return a.array[k] < b.array[k];
      }
      return false;
    }
    


  • Aber das gibt's auch schon fertig:
    http://www.cplusplus.com/reference/algorithm/lexicographical_compare/

    #include <algorithm>
    #include <functional>
    
    ...
    
    struct my_order : std::binary_function<dings,dings,bool>
    {
      bool operator()(dings const& a, dings const& b) const
      {
        return std::lexicographical_compare(
          a.array,a.array+3,
          b.array,b.array+3 );
      }
    }
    

    (ungetestet)



  • krümelkacker schrieb:

    krümelkacker schrieb:

    RTFM

    Sorry, ich dachte, es ging um das, was std::unique braucht, um Duplikate rauszuschmeißen. std::sort wäre mit einem entsprechenden operator< zufrieden.

    Du gehst einfach der Reihe nach vom ersten bis zum letzten Element und vergleichst die so lange, bis eines größer oder kleiner ist.

    ungetesteter Pseudocode

    bool operator<(dings const& a, dings const& b)
    {
      for (int k=0; k<3; ++k) {
        if (a.array[k] != b.array[k])
          return a.array[k] < b.array[k];
      }
      return false;
    }
    

    Danke, aber da kommt die Meldung

    Fehler 1 error C2804: Binärer Operator '<' hat zu viele Parameter



  • sdfsdf schrieb:

    Danke, aber da kommt die Meldung
    Fehler 1 error C2804: Binärer Operator '<' hat zu viele Parameter

    Das hast Du das, was als freie Funktion gedacht war, wahrscheinlich als Elementfunktion ("Methode") benutzen wollen.



  • krümelkacker schrieb:

    sdfsdf schrieb:

    Danke, aber da kommt die Meldung
    Fehler 1 error C2804: Binärer Operator '<' hat zu viele Parameter

    Das hast Du das, was als freie Funktion gedacht war, wahrscheinlich als Elementfunktion ("Methode") benutzen wollen.

    Danke!



  • ssdfdsf schrieb:

    krümelkacker schrieb:

    Das hast Du das, was als freie Funktion gedacht war, wahrscheinlich als Elementfunktion ("Methode") benutzen wollen.

    Danke!

    Siehe dazu auch den entsprechenden Artikel im Magazin 😉


Anmelden zum Antworten