Tengo un vector de Estudiante que tiene un nombre de campo.

Quiero recorrer el vector.

void print(const vector<Student>& students)
    {
    vector<Student>::iterator it;
    for(it = students.begin(); it < students.end(); it++)
        {
            cout << it->name << endl;
        }
    }

Al parecer, esto es ilegal en C++.

Ayuda por favor.

  • Por favor, lea acerca de prefijo frente a postfix operador de incremento. it++ debe ser ++it, y it++ es necesario en casos raros (es decir, cuando el borrado, mientras que la iteración).
  • Su bastante obvio cuál es el problema en este caso. Sin embargo, en el futuro, usted debe incluir en su pregunta, el mensaje de error exacto que el compilador está dando.
InformationsquelleAutor unj2 | 2011-02-03

6 Comentarios

  1. 62

    Usted tiene dos (tres en C++11) opciones: const_iterators y los índices (+ «rango» en C++11)

    void func(const std::vector<type>& vec) {
      std::vector<type>::const_iterator iter;
      for (iter = vec.begin(); iter != vec.end(); ++iter)
        //do something with *iter
    
      /* or
      for (size_t index = 0; index != vec.size(); ++index)
        //do something with vec[index]
    
      //as of C++11
      for (const auto& item: vec)
        //do something with item
      */
    }

    Se debe preferir el uso de != en lugar de < con iteradores que este último no funciona con todos los iteradores, el antiguo testamento. Con el ex-usted puede incluso hacer que el código sea más genérico (de modo que usted puede incluso cambiar el tipo de contenedor sin tocar el bucle)

    template<typename Container>
    void func(const Container& container) {
      typename Container::const_iterator iter;
      for (iter = container.begin(); iter != container.end(); ++iter)
        //work with *iter
    }
    • Soy nuevo en los iteradores. Puede usted por favor decirme que los iteradores no le gusta != y ¿por qué?
    • Sólo los iteradores de acceso aleatorio apoyo de los pedidos (<), otros no. Por ejemplo, std::list tiene bi-direccional de los iteradores, que sólo puede ser comparado por la igualdad.
  2. 19

    Uso const_iterator lugar. Un iterator permite la modificación de la vector, así que usted no puede conseguir uno de un const contenedor.

    También, la idiomáticas manera de escribir este bucle utiliza it != students.end() en lugar de < (aunque esto debería funcionar en un vector).

    • …pero si alguna vez decide cambiar el uso de una list o algo similar en su lugar, el código no funcionará. A fin de utilizar el != forma.
  3. 5

    C++11 de estilo:

    void print(const vector<Student>& students) {
        for(auto const& student : students) {
                cout << student.name << endl;
        }
    }
    • Underated respuesta 🙂
    • ¿Por qué crees que no ha relacionado? Esta es la forma de iterar sobre const vector en C++11.
    • Me dijo subestimada, pero mal escrita con una sola r. De todos modos, no decir no.
  4. 2
    void print(const vector<Student>& students)
        {
        vector<Student>::const_iterator it; //const_iterator
        for(it = students.begin(); it != students.end(); it++)
            {
                cout << it->name << endl;
            }
        }
  5. 2
    void print(const vector<Student>& students)
        {
        for(auto it = students.begin(); it != students.end(); ++it)
            {
                cout << it->name << endl;
            }
        }
    • esta pregunta es no marcados de C++0x
    • Pero esto es bueno acordarse de nosotros acerca de esa característica, tal vez lo que nos anima a cambiar a C++11. +1

Dejar respuesta

Please enter your comment!
Please enter your name here