2012-03-17 16 views
10

Quanto segue è un programma C++ che utilizza il contenitore vettoriale STL. Volevo solo sapere perché la funzione display() non sta stampando i contenuti vettoriali sullo schermo. Se la visualizzazione della linea size() è commentata, la funzione display() funziona correttamente.Visualizzazione del contenuto di un contenitore vettoriale in 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); 

} 

uscita:

Size of Vector=0 

Enter five integer values 

1 

2 

3 

4 

5 

Size of Vector=5 


Size of Vector=6 
+6

inizializzare le variabili! 'int i = 0' – YXD

+1

Quando si scorreva il vettore da visualizzare, si voleva chiaramente fermarsi alla fine. Ma dove volevi * iniziare *? :) (PS che abilita tutti gli avvisi nel compilatore potrebbe aver rilevato questo errore per te) – Hurkyl

+1

Devi davvero inizializzare le tue variabili iteratore ala 'int i = 0;' È molto pericoloso presumere che C++ ti abbia fatto un favore e inizializzato loro a '0'. – Josh

risposta

24

Esiste un modo idiomatico per stampare un vettore.

#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, " ")); 
} 

Questo modo è sicuro e non richiede di tenere traccia delle dimensioni dei vettori o qualcosa del genere. È anche facilmente riconoscibile per altri sviluppatori C++.

Questo metodo funziona anche su altri tipi di contenitori che non consentono l'accesso casuale.

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

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

questo funziona in entrambe le direzioni con l'ingresso anche considerare quanto segue:

#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, " ")); 
} 

Questa versione non richiede alcuna codifica duro di dimensioni o la gestione manuale degli elementi attuali.

+1

Usa "\ n" come secondo parametro per "ostream_iterator' per aggiungere una nuova riga al tuo output. – mihai

+0

Questa è la risposta idiomatica precedente al 2011. Dal 2011 abbiamo 'for (auto && x: container) std :: cout << x <<" ";' –

6

Non inizializza le variabili. for(int i = 0; non for(int i;

+3

Downvoted? Perché? –

2

penso che questo è il modo più semplice per andare:

#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; 

} 
Problemi correlati