Wann nutzt ihr std::pair?
-
Wer hindert dich daran fürs pair ein typedef und für first & second entsprechende inline Wrapper funktionen zu schreiben? Das dauert nich mehr als 10 sekunden. Ich versteh das Problem nicht, egal ob du jetzt sarkastisch bist oder nicht.
-
Shade Of Mine schrieb:
Weiters ist es praktisch eigene vergleichsoperatoren definieren zu können. std::pair verwendet man deshalb eigentlich nie.
Ich verwende
std::pairab und zu gerade wegen der Ordnung, nämlich um keinen Boilerplate-Code für Strict Weak Ordering mit zwei Elementen zu schreiben. Kommt vor allem bei Dingen wie Vektoren vor, die man in eine Map/Set steckt, ohne dass ihre Reihenfolge eine wichtige Rolle spielten.Ich habe auch schon temporäre
std::pairs erstellt, nur um solche Sortierfunktoren zu implementieren.
-
Katachi schrieb:
Wer hindert dich daran fürs pair ein typedef und für first & second entsprechende inline Wrapper funktionen zu schreiben? Das dauert nich mehr als 10 sekunden. Ich versteh das Problem nicht, egal ob du jetzt sarkastisch bist oder nicht.
In der Zeit haut man auch ne
struct FooBar { int foo; int bar; };raus und hat gleich schönere Namen und weniger Template-Wirrwarr.
-
Ethon schrieb:
In der Zeit haut man auch ne
struct FooBar { int foo; int bar; };raus und hat gleich schönere Namen und weniger Template-Wirrwarr.
Soweit ich mich recht entsinne müsstest du um die 100% kompatibilität mit den STL containern zu gewährleisten noch entsprechende constructoren und zuweisungs operator schreiben (http://msdn.microsoft.com/en-us/library/bb385469.aspx, gehen wir mal davon aus dass es sich nicht um simple Datentypen wie int handelt), da ist ein wrapping durchaus einfacher und fixer da bereits von natur aus gegeben (von der handhabung vllt nicht so elegant wie eine eigene Lösung aber die deutlichkeit ist equivalent).
-
Katachi schrieb:
Ethon schrieb:
In der Zeit haut man auch ne
struct FooBar { int foo; int bar; };raus und hat gleich schönere Namen und weniger Template-Wirrwarr.
Soweit ich mich recht entsinne müsstest du um die 100% kompatibilität mit den STL containern zu gewährleisten noch entsprechende constructoren und zuweisungs operator schreiben (http://msdn.microsoft.com/en-us/library/bb385469.aspx, gehen wir mal davon aus dass es sich nicht um simple Datentypen wie int handelt), da ist ein wrapping durchaus einfacher und fixer da bereits von natur aus gegeben (von der handhabung vllt nicht so elegant wie eine eigene Lösung aber die deutlichkeit ist equivalent).
Dass die entsprechende Klassen diese Funktionen haben müssen, bedeutet nicht per se, dass man sie selbst schreiben muss oder auch nur sollte. In bestimmten Fällen der obigen Art könnte es erforderlich sein, den Zuweisungsoperator selbst zu implementieren, wenn starke Exceptionsicherheit erforderlich ist und das zweite Element bei der Zuweisung werfen kann. Das dürfte aber nicht die Regel sein.
-
Für so eine struct schreibe ich mir zumindest noch einen ctor mit den zwei Parametern selbst. Und
The header <utility> also overloads the relational operators ==, <, !=, >, >= and <= , so as to be able to compare pair objects of the same type directly
Das meinte ich ja im OP damit, dass Operatoren bereits angeboten werden.
knivil:
Ok, sorry. Ich hatte Dich erst so verstanden, dass es um einen vector typisiert mit einer struct geht, das zwei Datenelemente hat, nicht um einen vector mit zwei Elementen. Letzteres mit pair zu vergleichen macht natürlich keinen Sinn...
-
Eisflamme schrieb:
ich habe jetzt häufiger Mal std::pair genutzt, wenn ich z.B. einen vector mit exakt zwei Elementen haben wollte.
Dann hätte ich eher an std::array<T,2> gedacht.
Eisflamme schrieb:
Wann nutzt ihr pair?
Eigentlich nur dann, wenn ich std::map verwende. Sonst fallen mir bessere Namen mit mehr Aussagekraft für eigene Typen ein. Jedenfalls fällt mir gerade keine andere Situation ein, wo ich pair benutze.
-
Ich benutze das häufig als Range-Wrapper in der Form
std::pair<iterator,iterator>(begin, end).
-
Könnte Dich interessieren, Tachyon:
Pairs do not make good ranges.
-
krümelkacker schrieb:
Könnte Dich interessieren, Tachyon:
Pairs do not make good ranges.Das das nicht garde toll ist, ist mir auch ohne Artikel klar aber boost.range nimmt halt ein pair an, um nicht direkt kompatible Iteratorpaare zu wrappen. Alleine, dass man mit Pair ein Ding hat, dass <T,U> ermöglicht, obwohl man eigentlich <T,T> haben will, spricht schon Bände.