2009-03-27 13 views
26

Tengo un montón de cadenas que debo ordenar. Creo que un std :: vector sería la forma más fácil de hacer esto. Sin embargo, nunca he usado vectores antes y por eso me gustaría algo de ayuda.¿Cómo puedo construir un archivo std :: vector <std::string> y luego ordenarlos?

Solo necesito ordenarlos alfanuméricamente, nada especial. De hecho, la función string :: compare funcionaría.

Después de eso, ¿cómo puedo repetirlos para verificar que estén ordenados?

Esto es lo que tengo hasta ahora:

std::sort(data.begin(), data.end(), std::string::compare); 

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i) 
{ 
    printf("%s\n", i.c_str); 
} 
+0

favor ver esta respuesta: [impulso :: especie] [1] [1]: http: // stackoverflow.com/a/14869307/1038233 – Magnetron

Respuesta

57

Usted sólo puede hacer

std::sort(data.begin(), data.end()); 

y va a ordenar las cuerdas. A continuación, vaya a través de ellos comprobar si son con el fin

if(names.empty()) 
    return true; // empty vector sorted correctly 
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
     j != names.end(); 
     ++i, ++j) 
    if(*i > *j) 
     return false; 
return true; // sort verified 

En particular, std::string::compare no podría ser utilizado como elemento de comparación, ya que no hace lo sort quiere que haga: Devuelve true si el primer argumento es menos que el segundo, y devuelve falso de lo contrario. Si usa sort como arriba, simplemente usará operator<, que hará exactamente eso (es decir, std::string lo devuelve first.compare(second) < 0).

+7

Simplemente por diversión (y no probado): comprobar que el vector está ordenado podría simplificarse a std :: adjacent_find (names.begin(), names.end(), std :: greater ()) == names.end() –

+0

@ Éric Malenfant - Lo he probado, funciona –

+0

@ Éric Malenfant, bien hecho –

3

¿Cuál es el problema exactamente? Parece que todo ya está allí.

Sin embargo, probablemente debería utilizar std::cout << *i << std::endl;

  1. i es un iterador == puntero a los datos en el contenedor, por lo que se necesita *
  2. c_str() es una función de std::string y no una variable

Los problemas en su código no se relacionan con su pregunta?

Algunos consejos para usted:

  • std::vector también anula [] operador, por lo que en su lugar puede ahorrar la molestia iterador y utilizarlo como un array (iterar 0-vector.size()).
  • En su lugar, puede usar std::set, que tiene una ordenación automática en la inserción (árbol binario), por lo que guarda la clasificación adicional.
  • El uso de un funtor hace que su producción sea aún más divertido: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
2

Para su uso para ordenar:
std::sort o std::vector< std::string>::sort(..) método.
Para comprobar si está ordenada:
uso std::is_sorted de verificación se clasifica - http://www.sgi.com/tech/stl/is_sorted.html
o
std::adjacent_find(v.begin(), v.end(), std::greater<std::string>()) == v.end()

para su caso podría utilizar comparador predeterminado

EDITADO:
std::is_sorted no es la función stl estándar, se definió en la implementación sgi stl.
Gracias @ Brian Neal para esta nota.

+1

No debe confiar en ese sitio sgi para obtener información sobre el STL. Es anterior al estándar. is_sorted no es estándar. –

+0

editado, gracias, por esta importante nota. – bayda

+1

corrígeme si estoy equivocado: is_sorted se agrega en C++ 11 http://en.cppreference.com/w/cpp/algorithm/is_sorted – abe312

2

litb es correcto, como siempre.

Solo quería señalar el punto más general - cualquier cosa que se pueda comparar con < se puede clasificar con std :: sort. a veces voy a escondidas una función miembro de operador < en una estructura, para que yo pueda hacer esto.

0

Puede usar un std::set, que es naturalmente un contenedor clasificado.

0

Clasificación de la cadena:

using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings 

Comprobación de si el vector está ordenada:

if(vec.empty()) 
    return true; // empty vector is sorted correctly 
for(std::vector< std::string>::iterator i=vec.begin(), j=i+1; j != vec.end(); ++i, ++j) 
    if(*i > *j) return false; 
return true; // sort verified 

C++ 11 Método para comprobar vector ordenados: std::is_sorted(vec.begin(),vec.end())

Ahora imprimir el vector ordenados:

for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i) 
{ 
    std::cout<< *i <<std::endl; 
} 
+0

He comprobado en codeblocks e ideone y esto FUNCIONA muy bien. Desde – abe312

+1

C++ 11, comprobando si el vector está ordenada es simplemente 'std :: está_ordenado (vec.begin(), vec.end())' –

+0

Usted no debe confiar en ese sitio SGI para obtener información sobre el TEL. Es anterior al estándar. is_sorted no es estándar – abe312

Cuestiones relacionadas