Cómo crear una lista de tuplas C ++

Soy bastante nuevo en c ++, realmente no tengo ningún fondo en ello. Estoy tratando de crear una lista de tuplas, la primera será una int, la segunda será una cadena.

#include  #include  #include  .... list< tuple > time; 

Y obteniendo un error. Quiero poder crear una lista, agregar entradas que pueda ordenar por el int, y tener la cadena que describe, lo que fue el int.

¿Cómo crearía esta lista?

Para una lista simple use std::vector lugar de std::list .

Probablemente solo quieras algo simple como:

 #include  #include  #include  #include "boost/tuple/tuple.hpp" using namespace std; using boost::tuple; typedef vector< tuple > tuple_list; int main(int arg, char* argv[]) { tuple_list tl; tl.push_back( tuple(21,"Jim") ); for (tuple_list::const_iterator i = tl.begin(); i != tl.end(); ++i) { cout << "Age: " << i->get<0>() << endl; cout << "Name: " << i->get<1>() << endl; } } 

std::list es en realidad una implementación de una lista con doble enlace que puede que no necesite.

Las respuestas aquí están un poco desactualizadas y no le dicen cómo ordenar la lista.

Desde C ++ 11 puede usar la tuple estándar, con un vector por ejemplo:

 #include  #include  // ... vector> data; 

Para agregar entradas puede usar el método emplace_back de vector . Aquí hay un ejemplo de lectura de la entrada estándar:

 #include  // ... int age; string name; while(cin >> age >> name) data.emplace_back(age, name); 

Para ordenar, es suficiente usar la función de sort estándar, ya que int es el primer elemento de la tupla en nuestro caso, el orden de clasificación predeterminado ordenará los elementos por int s primero, luego por string s:

 #include  // ... sort(data.begin(), data.end()); 

Puede recuperar valores de una tupla por índice:

 get<0>(data[i]) 

o por tipo:

 get(data[i]) 

He reunido un ejemplo completo que puedes ver en vivo en ideone .

Puede que no sea relevante aquí, pero si la “parte de creación” contiene llenar la lista de elementos, Boost.Assign podría ser útil. Puedes hacer algo como esto:

 #include  #include  int main() { typedef boost::tuple tuple; std::vector v = boost::assign::tuple_list_of(1, "foo")(2, "bar"); } 

Dependiendo de su escenario de curso.

Solo como una nota al margen:

El nuevo estándar de C ++ introduce varias plantillas y con eso también tuplas. gcc y Visual Studio (al menos) son compatibles con estos. Entonces, si es posible para usted (es decir, si todos los comstackdores compatibles admiten tuplas que ya son muy probables), podría usar esto.

El único problema es que algunos comstackdores todavía tienen tuple en el espacio de nombres std :: tr1 y otros ya lo tienen en el espacio de nombres std. También a veces hay que incluir y otras veces. Pero puede configurar su sistema de comstackción para definir algunas macros que le ayuden a admitir varios esquemas. Si, por ejemplo, solo necesita admitir Visual Studio 10 y / o una versión gcc bastante nueva, podría hacer lo siguiente:

 #include  #include  #include  std::list > time; 

Por ejemplo, con cmake podría generar un archivo de encabezado, que le brinda soporte para todos los comstackdores, que soportan tuplas (y con un poco más de trabajo, incluso use boost como un retroceso).

Para hacer esto, crearías algo como un archivo tuple.h.cmake:

 #if defined( __GNUC__ ) && (__GNUC__ * 100 + __GNUC_MINOR__ < 430) # define GCC_OLDER_THAN_430 1 #endif #if defined( _MSC_VER ) && (_MSC_VER < 1600 /* 2010 */) # define MSC_OLDER_THAN_2010 1 #endif #if defined( GCC_OLDER_THAN_430 ) # define TR1_IN_TR1_SUBDIRECTORY 1 #endif #if defined( ZORBA_GCC_OLDER_THAN_430 ) || defined( ZORBA_MSC_OLDER_THAN_2010 ) # define TR1_NS_IS_STD_TR1 1 #endif #ifdef TR1_NS_IS_STD_TR1 # define TR1_NS std::tr1 #else # define TR1_NS std #endif #ifdef TR1_IN_TR1_SUBDIRECTORY # include  #else # include  #endif 

Entonces, el ejemplo anterior se verá como sigue:

 #include  #include  #include "tuple.h" std::list > time; 

Esto debería funcionar en casi todos los comstackdores recientes.