2010-01-29 7 views
24

Ich versuche C++ zu lernen und gerade schreibe ich ein Programm, das eine Liste von Paaren von ganzen Zahlen ausgeben soll.Wie kann ich ein Zahlenpaar in C++ speichern?

Was ist der beste Weg, damit umzugehen? Ich habe nicht die Boost-Bibliothek auf unseren Linux-Computern in der Schule, also glaube ich nicht, dass ich boost :: tuple verwenden kann.

Irgendwelche Vorschläge?

+1

Wenn Sie eine ausreichend aktuelle Version von g ++ haben, die tr1 unterstützt, ist 'boost :: tuple' als' std :: tr1 :: tuple' enthalten; Wie andere in den Antworten unten bemerken, können Sie einfach 'std :: pair' für Paare verwenden. –

Antwort

31

Werfen Sie einen Blick auf std::pair<object, object>

EDIT:

Es ist Standard C++ und Teil dessen, was als STL (Standard Template Library) bekannt ist. Es ist eine Sammlung von netten Datenstrukturen, die generisch sind (d. H. Können zum Speichern eines beliebigen C++ - Objekttyps verwendet werden). Diese spezielle Struktur wird verwendet, um ein "Tupel" oder ein Zahlenpaar zusammen zu speichern. Es ist im Grunde ein Objekt mit Mitgliedern "first" und "second", die sich auf das erste und zweite Objekt (jedes Typs!) Beziehen, das Sie darin speichern.

So erklären nur eine Reihe von pair<int, int>, oder besser noch, einen anderen STL-Typ verwenden die „Vektor“ bezeichnet eine dynamisch-Größe Liste der pair<int, int> zu machen: vector<pair<int, int> > myList.

Hey was weißt du! Es existiert bereits eine dynamisch große Liste von Paaren, die als Karte bezeichnet wird. Es ist so einfach wie #include <map> und eine map<int, int> myMap zu deklarieren !!!

EDIT:

Ja, wie erwähnt, eine Karte gut „Karten“ einem Objekt zum anderen, so kann man nicht linken seitigen Werte wiederholt haben. Wenn das in Ordnung ist, dann suchen Sie nach einer Karte, ansonsten bleiben Sie bei dem Vektorpaar ... oder schauen Sie sich Multimaps an.

std::map, std::multimap

+0

Beachten Sie, dass die Ausgabe des Paares nicht von 'cout' (wie für' int' oder 'double') gehandhabt wird - Sie müssen es separat behandeln. – dirkgently

+5

In C++ 98 und C++ 03 müssen Sie 'vector >' (beachten Sie den Platz am Ende!) Verwenden, da '>>' als "Rechtsverschiebung" analysiert wird. Dies wird in C++ 0x behoben werden. – ephemient

+0

Ja, natürlich! Aktualisiert, danke, dass du es eingefangen hast! –

17

Verwendung std :: pair?

#include <utility> 
#include <iostream> 

int main() { 
    std::pair <int, int> p = std::make_pair(1, 2); 
    std::cout << p.first << " " << p.second << std::endl; 
} 

Sie können einen Vektor von Paaren machen:

typedef std::pair <int, int> IntPair; 

... 

std::vector <IntPair> pairs; 
pairs.push_back(std::make_pair(1, 2)); 
pairs.push_back(std::make_pair(3, 4)); 
+0

Würden Sie std :: pair over map vorschlagen? – Mithrax

+0

Mithrax, Karte ist nur ein Wrapper um Paar. Es verwendet den Paarcode intern. –

+1

@ Mithrax Das hängt davon ab, was Sie mit den Paaren machen wollen. Wenn einer ein Schlüssel ist und einer ein Wert, dann sollten Sie std :: map verwenden, was tatsächlich mit std :: pair implementiert wird. –

9

Während std :: pair ist der beste Ansatz zu verwenden, ich bin überrascht, niemand pre-stl Lösung erwähnt:

struct Pair { 
    int first; 
    int second; 
}; 

Es ist besorgniserregend, dass Leute denken, dass sie für solch ein triviales Problem Auftrieb brauchen.

+1

Pre -STL wie in Vor-Standard, voriges Jahrtausend? Und Sie fragen sich, warum niemand es erwähnt hat? Außerdem fehlen Ihrem Code einige wichtige/nette Eigenschaften von 'std :: pair', so dass es nicht einmal zu Illustrationszwecken dient. In der Tat, was ist der Zweck, diese Methode überhaupt zu erwähnen? –

+0

Konrad, ich habe gesagt, dass std :: pair besser ist. Ich sehe nicht, warum mein Code nicht für Illustrationszwecke dient. Mein Hauptpunkt war, dass manchmal Leute einfache Lösungen vergessen. – shura

+1

Wenn Sie nur versuchen, C++ zu lernen, ist dies die beste Antwort. Es ist einfach, unkompliziert und leicht an andere Probleme anzupassen. Sobald sie sich an struct gewöhnt haben, ist die Anpassung an die Klasse und die Bereitstellung von Methoden für Dinge wie MyObject.SecondValue leicht zu erlernen. In Kombination mit dem obigen Array-Vorschlag (zB Pair [] MyValues) gibt es wirklich keinen Grund, diese Antwort nicht zu akzeptieren. – nathanchere

Verwandte Themen