2010-01-29 21 views
24

Estoy tratando de aprender C++ y ahora estoy escribiendo un programa que necesita generar una lista de pares de números enteros.¿Cómo puedo almacenar un par de números en C++?

¿Cuál es la mejor manera de manejar esto? No tengo la biblioteca de impulso disponible en nuestras computadoras linux en la escuela, así que no creo que pueda usar boost :: tuple.

¿Alguna sugerencia?

+1

Si tiene una versión suficientemente reciente de g ++ que tiene soporte tr1, 'boost :: tuple' se incluye como' std :: tr1 :: tuple'; como otros señalan en las respuestas a continuación, puedes usar 'std :: pair' para los pares. –

Respuesta

31

Tenga una mirada en std::pair<object, object>

EDIT:

Es estándar de C++ y parte de lo que se conoce como la STL (Standard Template Library). Es una colección de buenas estructuras de datos que son genéricas (es decir, se pueden usar para almacenar cualquier tipo de objeto C++). Esta estructura en particular se usa para almacenar una "tupla" o un par de números juntos. Básicamente es un objeto con miembros "primero" y "segundo" que se refieren a los objetos primero y segundo (¡de cualquier tipo!) Que almacene en ellos.

Así que declarar una matriz de pair<int, int>, o mejor aún, utilizar otro tipo STL llamado el "vector" hacer una lista dinámica de tamaño de pair<int, int>: vector<pair<int, int> > myList.

¡Oye, qué sabes! ¡Ya existe una lista de pares de tamaño dinámico y se llama mapa! ¡Usarlo es tan simple como #include <map> y declarar un map<int, int> myMap!

EDIT:

Si, como se ha señalado, un mapa bien "mapas" un objeto a otro, lo que no puede haber repetido los valores del lado izquierdo. Si eso está bien, entonces un mapa es lo que estás buscando, de lo contrario mantente en el vector del par ... o echa un vistazo a las multimapas.

std::map, std::multimap

+0

Tenga en cuenta que la salida del par no será manejada por 'cout' (como lo es para' int' o 'double') - tendrá que manejarlo por separado. – dirkgently

+5

En C++ 98 y C++ 03, debe usar 'vector >' (observe el espacio al final!) Porque '>>' analiza como "desplazamiento a la derecha". Esto se solucionará en C++ 0x. – ephemient

+0

Sí, por supuesto! Actualizado, gracias por atrapar eso! –

17

uso 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; 
} 

Puede hacer un vector de pares:

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

¿Sugeriría std :: pair sobre el mapa? – Mithrax

+0

Mithrax, el mapa es solo un par de envoltura alrededor. Utiliza el código de par internamente. –

+1

@ Mitrax Eso depende de lo que quieras hacer con los pares. Si una es una clave y una es un valor, entonces debe usar std :: map, que de hecho se implementa usando std :: pair. –

9

Mientras std :: pair es el mejor enfoque a utilizar, estoy sorprende que nadie mencionado solución pre-STL:

struct Pair { 
    int first; 
    int second; 
}; 

Es preocupante que las personas piensen que necesitan impulso para un problema tan trivial.

+1

Pre -STL como en el pre-estándar, el milenio anterior? ¿Y te preguntas por qué nadie lo mencionó? Además, su código carece de varias características importantes/agradables de 'std :: pair', por lo que ni siquiera sirve para fines ilustrativos. De hecho, ¿cuál es el propósito de mencionar este método en absoluto? –

+0

Konrad, dije que std :: pair es mejor. No veo por qué mi código no sirve para fines ilustrativos. Mi punto principal es que a veces las personas olvidan soluciones simples. – shura

+1

Si solo está tratando de aprender C++, esta es fácilmente la mejor respuesta presentada. Es simple, sin complicaciones y fácil de adaptar a otros problemas. Una vez que se acostumbran a struct, se adaptan a la clase y proporcionan métodos para cosas como MyObject.SecondValue es fácil de enseñar. Combinado con la sugerencia de la matriz anterior (es decir, Pair [] MyValues) no hay realmente ninguna razón para no aceptar esta respuesta. – nathanchere

Cuestiones relacionadas