spezialisiertes swap-function wird nicht mehr gefunden
-
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