Tengo un montón de cadenas que necesito para ordenar. Creo que un std::vector sería la manera más fácil de hacer esto. Sin embargo, nunca he utilizado vectores de antes y por lo tanto me gustaría algo de ayuda.

Solo necesito ordenarlos de forma alfanumérica, nada especial. De hecho, la cadena::comparar la función de trabajo.

Después de eso, ¿cómo puedo recorrer a través de ellos para comprobar que están ordenados?

He aquí 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);
}
InformationsquelleAutor samoz | 2009-03-27

7 Comentarios

  1. 66

    Usted puede hacer

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

    Y va a ordenar sus cadenas. A continuación, vaya a través de ellos, verificar si están en orden

    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 podía ser utilizado como un comparador, porque no hacer lo sort quiere hacer: Devolver true si el primer argumento es menor que el segundo, y devuelve false en caso contrario. Si utiliza sort de arriba, se acaba de uso operator<, que va a hacer exactamente eso (que yo.e std::string hace volver first.compare(second) < 0).

    • Sólo por diversión (y probados): Comprobar que el vector está ordenado podría ser simplificado a std::adjacent_find(los nombres.begin(), nombres.end(), std::la mayor<std::string>()) == nombres.end()
  2. 3

    ¿Cuál es la pregunta exactamente? Parece que todo ya está ahí.

    Sin embargo, usted probablemente tendrá que usar std::cout << *i << std::endl;

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

    Los problemas en el código no se refieren a su pregunta?

    Algunos consejos para usted:

    • std::vector también invalida la [] operador, por lo que puede guardar el iterador de la molestia y utilizarlo como una matriz (iterar desde 0 a vector.size()).
    • Usted podría utilizar std::set lugar, que tiene automáticamente la ordenación por inserción (árbol binario), para guardar el extra de la clasificación.
    • El uso de un functor hace que su salida sea aún más divertido: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
  3. 2

    litb es correcto, como siempre.

    Yo sólo quería señalar el punto más general – algo que puede ser comparado con < pueden ser ordenados con std::ordenar. Yo a veces voy a colarse un operador< miembro de la función dentro de una estructura, para que yo pueda hacer esto.

  4. 2

    Para ordenar el uso de:

    std::sort o std::vector< std::string>::sort(..) método.

    Para comprobar si está ordenada:

    uso std::is_sorted para comprobar que se ordenan – http://www.sgi.com/tech/stl/is_sorted.html

    std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()

    para su caso podría utilizar por defecto el comparador de

    EDITADO:

    std::is_sorted no es un estándar stl función, definida en sgi stl aplicación.

    Gracias @Brian Neal para esta nota.

    • Usted no debe confiar en que el sgi sitio para obtener información sobre la STL. Es anterior a la norma. is_sorted no es estándar.
    • me corrija si estoy equivocado : is_sorted se agrega en c++11 en.cppreference.com/w/cpp/algorithm/is_sorted
  5. 0

    De ordenación de la cadena:

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

    La comprobación de si el vector está ordenado:

    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 ordenados vector:
    std::is_sorted(vec.begin(),vec.end())

    Impresión en el vector ordenado:

       for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
    {
        std::cout<< *i <<std::endl;
    }
    • He comprobado en codeblocks y ideone y este FUNCIONA bien.
    • Debido a que C++11, comprobando si el vector está ordenado es simplemente std::is_sorted(vec.begin(),vec.end())
    • Usted no debe confiar en que el sgi sitio para obtener información sobre la STL. Es anterior a la norma. is_sorted no es estándar
    • is_sorted no es estándar
    • AFAIK, is_sorted fue añadido en C++11
  6. 0

    Usted podría utilizar un std::set, que es, naturalmente, un ordenan contenedor.

  7. 0

    Trate de usar comaprator:

     #include <cmath>
     #include <cstdio>
     #include <vector>
     #include <iostream>
     #include <algorithm>
     using namespace std;
    
    //comparing function only sorts if string size is equal and keeps the larger integgers at last.
    bool myfunction (string i,string j) 
    { 
    int n=i.length();
    int m=j.length();
    if(n==m)
        return (i<j);
    
    return n<m;   
      }
    
    
    int main() {
    int n;
    cin>>n;
    vector <string> arr(n);
    for(int i=0;i<n;i++)
        cin>>arr[i];
    
    
    sort(arr.begin(),arr.end(),myfunction);
    
    for(int i=0;i<n;i++)
        cout<<arr[i]<<endl;
    
    return 0;
     }

Dejar respuesta

Please enter your comment!
Please enter your name here