2012-03-17 37 views
10

Sau đây là chương trình C++ sử dụng vùng chứa vector STL. Chỉ muốn biết tại sao hàm display() không in nội dung vectơ lên ​​màn hình. Nếu hiển thị dòng size() được nhận xét, hàm display() hoạt động tốt.Hiển thị nội dung của vùng chứa vector trong 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); 

} 

Output:

Size of Vector=0 

Enter five integer values 

1 

2 

3 

4 

5 

Size of Vector=5 


Size of Vector=6 
+6

khởi tạo các biến của bạn! 'int i = 0' – YXD

+1

Khi bạn lặp qua vectơ của mình để hiển thị, bạn rõ ràng muốn dừng ở cuối. Nhưng bạn muốn bắt đầu * ở đâu? :) (PS cho phép tất cả các cảnh báo trong trình biên dịch của bạn có thể đã bắt gặp lỗi này cho bạn) – Hurkyl

+1

Bạn thực sự nên khởi tạo biến lặp của bạn ala 'int i = 0; 'Rất nguy hiểm khi cho rằng C++ đã giúp bạn và khởi tạo chúng thành '0'. – Josh

Trả lời

24

Có một cách thành ngữ để in véc tơ.

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

Cách này an toàn và không yêu cầu bạn theo dõi kích thước vectơ hoặc bất cứ thứ gì tương tự. Nó cũng dễ dàng nhận ra với các nhà phát triển C++ khác.

Phương pháp này cũng hoạt động trên các loại vùng chứa khác mà không cho phép truy cập ngẫu nhiên.

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

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

này hoạt động cả hai cách với đầu vào quá cân nhắc những điều sau đây:

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

Phiên bản này không đòi hỏi bất kỳ mã hóa cứng kích thước hoặc quản lý thủ công trong những yếu tố thực tế.

+1

Sử dụng "\ n" làm tham số thứ hai cho 'ostream_iterator' để thêm dòng mới vào đầu ra của bạn. – mihai

+0

Đây là câu trả lời thành ngữ trước năm 2011. Kể từ năm 2011, chúng tôi có 'for (auto && x: container) std :: cout << x <<" ";' –

6

Bạn chưa khởi tạo các biến của bạn. for(int i = 0; không for(int i;

+3

Bị bỏ phiếu? Tại sao? –

2

Tôi nghĩ rằng đây là cách dễ nhất để đi:

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

} 
Các vấn đề liên quan