¿Cómo puedo ordenar esto vector
comparando el pair.first
que es un std::string
? (sin proporcionar una función de comparación estática, ni usar boost).Ordenar un std :: vector <std :: pair <std :: string, bool >> por la cadena?
Respuesta
std::vector<std::pair<std::string, bool> > v;
std::sort(v.begin(), v.end());
std::pair
operator<
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.
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> >()));
Tenga en cuenta que 'select1st' no es parte de la biblioteca estándar de C++. –
Mmm. Afortunadamente, es trivial escribir: 'template
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
.
Necesito considerar el caso en que el usuario no quiere que se clasifiquen y en el orden en que se los dieron. – jmasterx
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
- 1. std :: vector <std::string> crash
- 2. Convierte std :: string en std :: vector <char>
- 3. ¿Por qué std :: sub_match <T> hereda públicamente de std :: pair <T, T>?
- 4. ¿El ordenamiento std :: pair <int, std :: string> está bien definido?
- 5. Cómo "fundido" un std :: vector <char> std :: vector <wchar_t>
- 6. const std :: map <boost :: tuples :: tuple, std :: string>?
- 7. std :: move entre std :: string y std :: vector <unsigned char>
- 8. Cómo guardar `std :: vector <uchar>` en `std :: ostream`?
- 9. vector de std :: función <>
- 10. std :: array <char, N> std :: string
- 11. ¿Cómo puedo construir un archivo std :: vector <std::string> y luego ordenarlos?
- 12. boost :: recortar cada cadena en std :: vector <std::string>
- 13. ¿Por qué no se define main `main (std :: vector <std::string> args)`?
- 14. Fuga de memoria con std :: cadena al usar std :: list <std::string>
- 15. Convierte un std :: vector <std :: vector <double>> representa una matriz 2D a cv :: Mat
- 16. std :: string o std :: vector <char> para contener datos en bruto
- 17. En la declaración "std :: vector <X> f();", ¿es "std :: vector <X>" una instanciación?
- 18. C++ std :: pair, std :: vector y memcopy
- 19. convirtiendo una matriz de cadenas terminadas nulas const char * a std :: vector <std :: string>
- 20. ¿Están C++ std :: map <string, string> ordenados?
- 21. ¿Puedo lanzar std :: vector <Animal*> a std :: vector <Dog*> sin mirar cada elemento?
- 22. Manera correcta de dividir un std :: string en un vector <string>
- 23. Copie convenientemente std :: vector <unsigned char> al objeto de entrada de flujo (std :: istream)
- 24. std :: lista <std :: unique_ptr <T>>: que pasa a su alrededor
- 25. Puede aumentar :: lexical_cast <std::string> (Int_Type) ever throw?
- 26. impulso :: ptr_container y std :: vector <shared_ptr>
- 27. std :: cin.ignore (std :: numeric_limits <std :: streamsize> :: max(), '\ n') de error al utilizar # include <Windows.h>
- 28. auto de const std :: vector <> &; objeto o referencia?
- 29. OpenCV std :: vector <cv :: Point2f> a cv :: Mat
- 30. std :: vector <double> destrucción lanza SIGABRT
Esta es una respuesta de C++ 0x solamente. ;) Editar: Ahora fijo ('>>' token que cierra dos plantillas anidadas '<>' pares es C++ 0x solamente). –
@Charles: ¡Ja! Sí, probablemente lo haga en muchas respuestas. Estoy demasiado acostumbrado a usar un compilador que admita '>>'. –
+1: No sabía que 'std :: pair :: operator <()' estaba sobrecargado. ¡Ahora si! –