2008-11-26 17 views
11

Creo que he declarado un vector con un objeto correctamente. Pero, no sé cómo acceder a sus miembros cuando bucleo con Iterator.C++ STL Vector Iterator acceder a los miembros de un objeto

En mi código, la línea --- >> cout < < "" < < * Iter;

¿Cómo imprimo los contenidos de los miembros? Me gusta * Iter.m_PackLine ???

No estoy seguro de haber utilizado la terminología correcta, pero agradezco la ayuda. Gracias

class CFileInfo 
{ 
    public: 
     std::string m_PackLine; 
     std::string m_FileDateTime; 
     int m_NumDownloads; 
}; 

void main() 
{ 
    CFileInfo packInfo; 

    vector<CFileInfo, CFileInfo&> unsortedFiles; 
    vector<CFileInfo, CFileInfo&>::iterator Iter; 

    packInfo.m_PackLine = "Sample Line 1"; 
    packInfo.m_FileDateTime = "06/22/2008 04:34"; 
    packInfo.m_NumDownloads = 0; 
    unsortedFiles.push_back(packInfo); 

    packInfo.m_PackLine = "Sample Line 2"; 
    packInfo.m_FileDateTime = "12/05/2007 14:54"; 
    packInfo.m_NumDownloads = 1; 
    unsortedFiles.push_back(packInfo); 

for (Iter = unsortedFiles.begin(); Iter != unsortedFiles.end(); Iter++) 
{ 
    cout << " " << *Iter; // !!! THIS IS WHERE I GET STUMPED 
    // How do I output values of the object members? 
} 
} // end main 
+0

Rico: al publicar preguntas, utilice el botón "Código" para formatear su código fuente. El formato del código mantendrá la sangría y hará resaltar la sintaxis. Obtendrás una respuesta más rápida de esa manera. –

Respuesta

16
cout << " " << *Iter; 

sólo funcionará si CFileInfo tiene un operator<< sobrecargado que puede generar su estructura. Puede dar salida a los miembros individuales de la estructura en su lugar como este:

cout << " " << Iter->m_PackLine; 

Alternativamente, la siguiente es equivalente a:

cout << " " << (*Iter).m_PackLine; 

Tienes que poner paréntesis alrededor * Iter, ya que el operador de acceso miembro se une más de lo contrario.

En un nodo lateral, haga que su función principal devuelva int en lugar de vacía. hacer que vuelva vacío no es válido en C++.


se declara el vector de la siguiente manera:

vector<CFileInfo, CFileInfo&> unsortedFiles; 

El segundo argumento de vector debería haber otra cosa. No es necesario que el código proporcione al vector un segundo argumento. Sólo tiene que utilizar esto:

vector<CFileInfo> unsortedFiles; 

Otra cosa que he notado es que incrementan el iterador utilizando Iter++ (llamado postfix increment). Para los iteradores, siempre prefiera ++Iter, que se llama prefix increment.

+0

El segundo parámetro de plantilla vectorial es un Allocator. Se usa para solicitar memoria cuando el vector crece. –

+0

sí, lo sé. no quiero complicar esta respuesta :) –

1

Este es el primer problema que he notado:

std::vector es una plantilla.

tiene:

vector unsortedFiles; 

necesita algo como:

vector<CFileInfo> unsortedFiles; 

Ahora que lo pienso, su definición de plantilla puede haber llegado sólo analizada por el sistema de comentarios stackoverflow.

+0

Sí, fue analizado, jeje :) – richyz

3

Use (* iter) .member o iter-> member.

También puede utilizar los temporales:

CFileInfo &fileInfo = *iter; 
cout << " " << fileInfo.myMember; 

Además, por lo que está haciendo, lo que probablemente quieren un const_iterator en lugar de un iterador (mutable).

Además, std :: vector es una plantilla que acepta un nombre de tipo y un asignador, no dos tipos de letra. Se puede utilizar el asignador predeterminado mediante arrastre el segundo argumento de plantilla:

vector<CFileInfo> unsortedFiles; 
vector<CFileInfo>::iterator Iter; 

Algunos puntillosa:

  • principal debe devolver un int.
  • Probablemente sea mejor declarar su variable de iterador en la instrucción for.
  • Probablemente sea más rápido en el rendimiento en tiempo de ejecución usar el operador prefijo ++ (++ iter) en lugar del operador postfix (iter ++) en su ciclo for.
  • No es necesario que hagas tu comentario sobre main() ending.
1

Primera correcta declaración you'r vectorial:

vector<CFileInfo > unsortedFiles; 

continuación, tiene que definir un operador de salida para su clase:

std::ostream& operator<<(std::ostream& str,CFileInfo const& data) 
{ 
     // Do something here 
     /* Potentailly you could do this 
     * But this requires that this function be a friend of the class 

     str << data.m_PackLine << ":" 
      << data.m_FileDateTime << ":" 
      << data.m_NumDownloads << ":"; 

     * Or you could do this 

      data.print(str); // Make print a public const method. 

     */ 

     return str; 
} 

Por lo general, o bien hacer que el operador de salida de un amigo su clase o proporcionar un método de impresión pública que toma una secuencia. De cualquier forma, puede acceder a los miembros y transmitirlos manualmente a la salida.

Una vez que haya el iterador de salida definida puede cambiar su bucle de usar las versiones de la biblioteca estándar:

std::for_each(unsortedFiles.begin() 
       unsortedFiles.end() 
       std::ostream_iterator<CFileInfo>(std::cout," ") 
      ); 
1
iter->m_PackLine 

o

(*iter).m_PackLine 
-1

Gracias a todos, ojalá pudiera conceder varios puntos por las respuestas :)

litb también señaló un problema que estaba teniendo en mi declaración del vector. Eliminé el segundo argumento en la declaración del vector y funcionó.

Stackoverflow analizó parte de mi código, tendré más cuidado al publicarlo la próxima vez.

0

vector<CFileInfo, CFileInfo&> no funcionará en absoluto. El segundo parámetro para vector es el asignador que usa el vector, y CFileInfo no cumple con esos requisitos, ni tiene ningún tipo de referencia. Creo que solo quiere vector<CFileInfo>, los iteradores y miembros devolverán CFileInfo& automáticamente.

Cuestiones relacionadas