2012-03-17 25 views
10

El siguiente es un programa C++ que utiliza el contenedor vectorial STL. Solo quería saber por qué la función de visualización() no imprime los contenidos vectoriales en la pantalla. Si la línea de tamaño() está comentada, la función de pantalla() funciona bien.Mostrar el contenido de un contenedor vectorial en C++

#include <iostream> 
#include <vector> 

using namespace std; 

void display(vector<int> &v) 
{ 
    for(int i = 0; i < v.size(); i++) 
    { 
     cout << v[i] << " "; 
    } 
    cout << "\n" << endl; 
} 

int main() 
{ 
    vector<int> v; 
    cout << "Size of Vector=" << v.size() << endl; 

    //Putting values into the vector 
    int x; 
    cout << "Enter five integer values" << endl; 
    for(int i; i<5; i++) 
    { 
     cin >> x; 
     v.push_back(x); 
    } 
    //Size after adding values 
    cout << "Size of Vector=" << v.size() << endl; 

    //Display the contents of vector 
    display(v); 

    v.push_back(6); 

    //Size after adding values 
    cout << "Size of Vector=" << v.size() << endl; 

    //Display the contents of vector 
    display(v); 

} 

Salida:

Size of Vector=0 

Enter five integer values 

1 

2 

3 

4 

5 

Size of Vector=5 


Size of Vector=6 
+6

inicializar las variables! 'int i = 0' – YXD

+1

Cuando iteraba a través de su vector para visualizar, claramente quería detenerse al final. Pero, ¿dónde querías * comenzar *? :) (PS habilitando todas las advertencias en tu compilador podría haber detectado este error) – Hurkyl

+1

Realmente debes inicializar tus variables de iterador ala 'int i = 0;' Es muy peligroso asumir que C++ te ha hecho un favor e inicializado ellos a '0'. – Josh

Respuesta

24

Hay una manera idiomática de imprimir un vector.

#include <algorithm> 
#include <iterator> 

//note the const 
void display_vector(const vector<int> &v) 
{ 
    std::copy(v.begin(), v.end(), 
     std::ostream_iterator<int>(std::cout, " ")); 
} 

Esta forma es segura y no requiere que realice un seguimiento del tamaño de los vectores ni nada de eso. También es fácilmente reconocible por otros desarrolladores de C++.

Este método funciona también en otros tipos de contenedores que no permiten el acceso aleatorio.

std::list<int> l; 
//use l 

std::copy(l.begin(), l.end(), 
      std::ostream_iterator<int>(std::cout, " ")); 

Esto funciona en ambos sentidos con la entrada demasiado en cuenta lo siguiente:

#include <vector> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    std::cout << "Enter int end with q" << std::endl; 
    std::vector<int> v; //a deque is probably better TBH 
    std::copy(std::istream_iterator<int>(std::cin), 
       std::istream_iterator<int>(), 
       std::back_inserter<int>(v)); 

    std::copy(v.begin(), v.end(), 
       std::ostream_iterator<int>(std::cout, " ")); 
} 

Esta versión no requiere ningún tipo de codificación dura del tamaño o la gestión manual de los elementos reales.

+1

Use "\ n" como el segundo parámetro para 'ostream_iterator' para agregar una nueva línea a su salida. – mihai

+0

Esta es la respuesta idiomática anterior a 2011. Desde 2011 tenemos 'for (auto && x: container) std :: cout << x <<" "; –

6

No está inicializando sus variables. for(int i = 0; no for(int i;

+3

¿Vástago descendente? ¿Por qué? –

2

creo que esta es la manera más fácil de ir:

#include <iostream> 
#include <vector> 

using namespace std; 

int main(){ 
    vector<int> v; 
    int x; 
    cout << "Enter five integer values" << endl; 
    for(int i=0; i<5; i++) 
    { 
     cin >> x; 
     v.push_back(x); 
    } 

    for (int i = 0; i < (int)v.size(); i++) 
     cout<< v.at(i) <<endl; 

} 
Cuestiones relacionadas