spezialisiertes swap-function wird nicht mehr gefunden



  • Huhu,

    ich habe einen neuen Beitrag aufgemacht, weil ich jetzt ne spezielle frage habe 🙂

    und zwar habe ich folgendes:

    template <typename T> class Foo{
        // Konstruktoren, Klassenvariabelen,...
        void swap(Foo<T>& other);
    };
    
    template<typename T> void Foo<T>::swap(Foo<T>& other){
        using std:swap;
        // alle variablen tauschen
    }
    template<typename T> bool operator<(const Foo<T>& lhs, const Foo<T>& rhs){
      // ...
    }
    
    template<typename T>void std::swap(Foo<T>& lhs, Foo<T>& rhs)
    { 
      lhs.swap(rhs);
    }
    

    Leider wird das spezialisierte swap nicht benutzt wenn ich sortieren will...
    Könnt ihr sehen was ich falsch gemacht habe?



  • Woher weißt du das "sort" überhaupt "swap" verwendet, oder wie sortierst du?



  • huhu, genau ich benutze container mit Foo's und will diesen sortieren mit

    sort(container.begin(),container.end());
    


  • Soweit ich weiß ist nicht vorgeschrieben, dass sort zum Vertauschen auch swap verwendet.



  • David_pb schrieb:

    Soweit ich weiß ist nicht vorgeschrieben, dass sort zum Vertauschen auch swap verwendet.

    ja - hab ich auch gerade so verstanden
    hier steht bei requirements nur: muss swappable sein und unter swappable verstehen die, dass es entweder swap überladen hat oder copyctor und assignment op überladen hat...

    welche implementierung der standard lib hast du denn, die kein swap aufruft? gcc? die ruft glaube iter_swap auf und die wiederrum macht nen dreieckstausch - das hatten wir vor kurzem schon mal - relativ fail xD

    bb



  • hmm okay, aber als du es hier angesprochen hattest http://www.c-plusplus.net/forum/viewtopic-var-t-is-258748-and-start-is-30.html
    hatte ich es doch ausprobiert und er hat ja swaps gezählt.. jetzt habe ich nur die Klassenvariabeln geändert und jetzt geht er nicht mehr rein..

    kann mir jemand den Unterschied erklären?

    Veilen Dank 🙂



  • ich kann es nicht - aber poste mal bitte die implementierung von std::sort und std::iter_swap

    bb

    edit: mir ist gerad so langweilig, dass ich es direkt mal compiliert und getestet hätte - aber du hast nicht mal was kompilierbares gepostet 😣 das wäre dann nach dem sort + iter_swap posten das nächste^^



  • unskilled schrieb:

    welche implementierung der standard lib hast du denn, die kein swap aufruft? gcc? die ruft glaube iter_swap auf und die wiederrum macht nen dreieckstausch - das hatten wir vor kurzem schon mal - relativ fail xD

    genau, ich benutze g++

    unskilled schrieb:

    ich kann es nicht - aber poste mal bitte die implementierung von std::sort und std::iter_swap

    hmm? wo kann ich die denn einsehen?
    Oder muss ich die auch überladen?



  • windschief schrieb:

    unskilled schrieb:

    welche implementierung der standard lib hast du denn, die kein swap aufruft? gcc? die ruft glaube iter_swap auf und die wiederrum macht nen dreieckstausch - das hatten wir vor kurzem schon mal - relativ fail xD

    genau, ich benutze g++

    unskilled schrieb:

    ich kann es nicht - aber poste mal bitte die implementierung von std::sort und std::iter_swap

    hmm? wo kann ich die denn einsehen?
    Oder muss ich die auch überladen?

    nein, musst du nicht
    du machst nen rechtsklick auf sort und klickst dann auch "go to definition" - dann postest du die sort funktion und die ruft iter_swap auf und da machst du wieder nen rechtsklick drauf und dann "go to definition" und dann postest du noch iter_swap (wobei sich das mit der angabe "ich nutze gcc" eh erledigt hat^^)...
    wenn irgendjmd lust hat, könnte er ja vll mal nen ticket schreiben, dass iter_swap dämlich implementiert ist und hoffen, dass beim nächsten gcc-update es dann sinnvoller implementiert ist^^

    wenns allerdings nur bei dir funktionieren soll, dann kannst du iterswap einfach mal ändern:

    template<typename T>
    void iter_swap(T &__lhs, T &__rhs)
    {
      T __tmp = __lhs;
      *__lhs = *__rhs;
      *__rhs = __tmp;
    }
    

    so in etwa sieht es glaube ich bisher aus

    und du änderst es einfach in:

    template<typename T>
    void iter_swap(T &__lhs, T &__rhs)
    {
      swap(*__lhs, *__rhs);
    }
    

    bb



  • Huhu,
    könnte es sein dass folgendes sort verwendet wird?

    template<typename _RandomAccessIterator>
        inline void
        sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
        {
          typedef typename iterator_traits<_RandomAccessIterator>::value_type
    	_ValueType;
    
          // concept requirements
          __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
    	    _RandomAccessIterator>)
          __glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
          __glibcxx_requires_valid_range(__first, __last);
    
          if (__first != __last)
    	{
    	  std::__introsort_loop(__first, __last,
    				std::__lg(__last - __first) * 2);
    	  std::__final_insertion_sort(__first, __last);
    	}
        }
    

    Was mir noch eingefallen ist... vorher hatte ich ja einen struct als Foo und dann habe ich es in class geändert.. ich weiß es ist (fast) das gleich 😉
    aber viell hängt es auch damit zusammen, sonst habe ich eigentlich nichts geändert...



  • http://gcc.gnu.org/ml/libstdc++/2004-08/msg00167.html
    Ganz interessant um zu verstehen, warum iter_swap nicht immer swap benutzt.



  • YASC schrieb:

    http://gcc.gnu.org/ml/libstdc++/2004-08/msg00167.html
    Ganz interessant um zu verstehen, warum iter_swap nicht immer swap benutzt.

    also sollte man iter_swap auch noch spezialisieren? (bzw verbotenerweise überladen)
    es ist ja das einzige argument, dass man vll kein adl haben möchte(wieso auch immer man das nicht wollen sollte) - oder hab ich da zu wenig gelesen und zu viel überflogen? ^^

    bb


Anmelden zum Antworten