2011-01-05 27 views

Respuesta

33
std::vector<std::pair<std::string, bool> > v; 
std::sort(v.begin(), v.end()); 

std::pairoperator< sobrecargas para ordenar primero por el elemento first entonces por el elemento second. Por lo tanto, si solo ordena el vector usando el orden de clasificación predeterminado (operator<), obtendrá el pedido deseado.

+1

Esta es una respuesta de C++ 0x solamente. ;) Editar: Ahora fijo ('>>' token que cierra dos plantillas anidadas '<>' pares es C++ 0x solamente). –

+0

@Charles: ¡Ja! Sí, probablemente lo haga en muchas respuestas. Estoy demasiado acostumbrado a usar un compilador que admita '>>'. –

+4

+1: No sabía que 'std :: pair :: operator <()' estaba sobrecargado. ¡Ahora si! –

0

Puede utilizar un comparador personalizado para ordenar solo en los pares '.first.

sort(begin, end, 
    compose2(less<string>(), 
       select1st<pair<string, bool> >(), 
       select1st<pair<string, bool> >())); 
+2

Tenga en cuenta que 'select1st' no es parte de la biblioteca estándar de C++. –

+0

Mmm. Afortunadamente, es trivial escribir: 'template struct select1st: public unary_function {const typename T :: first_type & operator() (const T & x) const {return x.first;}};' – ephemient

2

me gusta mucho la respuesta de James, pero hay otra opción que podría considerar - sólo canalizar todo en un std::map:

std::map<std::string, bool> myMap(v.begin(), v.end()); 

O, si usted tiene cadenas duplicadas, una std::multimap:

std::multimap<std::string, bool> myMultiMap(v.begin(), v.end()); 

Esto tiene la ventaja añadida de que si este caso es necesario añadir o eliminar nuevos pares clave/valor, lo puede hacer en o (lg n), en lugar de o (n) para el vector clasificado

Si realmente debe usar un vector, vaya con la respuesta de James. Sin embargo, si tiene un vector de pares, hay buenas posibilidades de que realmente desee un std::map.

+0

Necesito considerar el caso en que el usuario no quiere que se clasifiquen y en el orden en que se los dieron. – jmasterx

+1

También vector + sort puede en la práctica ser mucho más rápido que insertar muchas cosas en un (multi) mapa, independientemente de lo que diga la notación de O grande. – Reunanen

Cuestiones relacionadas