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.