Swap implentieren und durch die STL beuntzen lassen
-
Stimmt. Mit dem Windowscompiler wird "testtest" ausgegeben, mit CodeBlocks nicht. Kann sich jemand vorstellen, woran das liegen könnte?
-
Hab mal in den Quellcode der Standardbibliothek von g++ geguckt. Dort wird in random_shuffle **iter_**swap benutzt.
-
Und in iter_swap wird swap nicht benutzt um den Tausch zu machen.
-
Aber ruft iter_swap nicht std::swap auf? (Zumindest laut C++ Reference: http://www.cplusplus.com/reference/algorithm/iter_swap/)
-
g++ 3.4.5 (MinGW):
template<typename _ForwardIterator1, typename _ForwardIterator2> inline void iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) { typedef typename iterator_traits<_ForwardIterator1>::value_type _ValueType1; typedef typename iterator_traits<_ForwardIterator2>::value_type _ValueType2; const _ValueType1 __tmp = *__a; *__a = *__b; *__b = __tmp; }Visual C++ 2008:
template<class _FwdIt1, class _FwdIt2> inline void iter_swap(_FwdIt1 _Left, _FwdIt2 _Right) { swap(*_Left, *_Right); }
-
Ist die G++-Implementierung wirklich so schlecht, dass sie jegliche
swap()-Funktionen auf Namensraum-Ebene einfach ignoriert?
Meiner Ansicht nach müsste
iter_swap(a, b)das Gleiche tun wieswap(*a, *b)-- im Idealfall mit ADL. Wenn man nun aufgrund von Exceptionsicherheit oder Performance gezwungen wird, immer die zweite Möglichkeit zu wählen, finde ichstd::iter_swap()etwas witzlos.
-
Vielleicht sollte man sich vor Augen halten, dass das die Implementierung aus dem 3.4.5 gcc ist. Mittlerweile ist der 4.4.2 aktuell.
MinGW ist einfach chronisch veraltet.Bei meinem g++ wird hier auch wie gewünscht zwei mal test ausgegeben.
-
Jau mit g++ 4.4.1 für Windows ( http://www.tdragon.net/recentgcc/ ) funktionierts auch.
-
Okay, dann ist ja alles in Ordnung. Hat mich nur gerade etwas gewundert...

-
YASC schrieb:
Vielleicht sollte man sich vor Augen halten, dass das die Implementierung aus dem 3.4.5 gcc ist. Mittlerweile ist der 4.4.2 aktuell.
MinGW ist einfach chronisch veraltet.Das war mal.