2012-08-03 11 views
6

Tôi khá mới đối với C++ đặc biệt là STL. Tôi đang cố gắng để vượt qua một vector như là đối số cho một chức năng, nhưng nó gây ra các ứng dụng sụp đổ. Tôi đang sử dụng Code :: Blocks và MingW. Đây là một mã đơn giản.Vượt qua một vector làm đối số và sử dụng nó, tại sao nó lại gặp sự cố?

#include <iostream> 
#include <vector> 

using namespace std; 

void foo(const vector<int> &v) 
{ 
    cout << v[0]; 
} 
int main(){ 
    vector<int> v; 
    v[0] = 25; 
    foo(v); 
return 0; 
} 

Cảm ơn!

Trả lời

6

Lỗi treo vì bạn viết hết phần cuối của vectơ với v[0] - đó là hành vi không xác định. Kích thước của nó là 0 nếu bạn không làm gì cả. (Bạn sau đó cũng đọc như vậy, nhưng tất cả mọi phiên cược đều được thực hiện tốt trước thời điểm đó).

Bạn có thể muốn làm:

vector<int> v; 
v.push_back(25); 
foo(v); 

Hoặc có thể:

vector<int> v(1); 
v.at(0) = 25; 
foo(v); 

Nếu bạn sử dụng v.at(n) thay vì toán tử [] bạn sẽ nhận được ngoại lệ ném chứ không phải là hành vi không xác định.

+0

Cảm ơn! Tôi nên tìm hiểu thêm về STL. Tôi đối xử với một vector như là một mảng đơn giản mà dường như là sai! – Physer

+0

@Physer - một vectơ tương tự như một mảng theo nhiều cách. Đọc qua phần cuối của vectơ không tốt hơn/tồi tệ hơn khi đọc qua phần cuối của một mảng. – Flexo

+0

Tôi hiểu ý của bạn là gì. Đây là một đoạn trích của một mã lớn hơn mà tôi đang làm việc. Ban đầu tôi đã cho vectơ một kích thước v (100) và điền nó bằng cách sử dụng một vòng lặp, như v [i] = giá trị; ... – Physer