2013-03-18 24 views
8

Tôi đang lấy 20 dòng đầu vào. Tôi muốn tách các nội dung của mỗi dòng bằng một khoảng trắng và đặt nó vào một vec tơ vectơ. Làm cách nào để tạo một vec tơ vectơ? Tôi gặp phải cuộc đấu tranh đẩy nó trở lại ...cách đẩy lùi trên vec tơ vectơ?

tập tin đầu vào của tôi:

Mary had a little lamb 
lalala up the hill 
the sun is up 

Các vector nên trông giống như một cái gì đó như thế này.

ROW 0: {"Mary","had", "a","little","lamb"} 
ROW 1: {"lalala","up","the","hill"} 

Đây là mã của tôi ....

string line; 
vector <vector<string> > big; 
string buf; 
for (int i = 0; i < 20; i++){ 
    getline(cin, line); 
    stringstream ss(line); 

    while (ss >> buf){ 
     (big[i]).push_back(buf); 
    } 
} 
+0

Bạn có vec tơ vectơ ở đằng kia. Có gì sai với mã của bạn? –

+1

@AndyProwl ra khỏi giới hạn truy cập (giả sử mã là một đại diện tốt của một thực tế). – juanchopanza

+0

@juanchopanza: Ồ, đúng :) Tốt bắt –

Trả lời

5

Yo thể bắt đầu với một vector của các kích thước ruleNum

vector <vector<string> > big(ruleNum); 

này sẽ tổ chức ruleNum trống vector<string> yếu tố. Sau đó, bạn có thể đẩy lùi các phần tử vào từng phần tử, như bạn hiện đang làm trong ví dụ bạn đã đăng.

10

Mã đúng, nhưng vectơ của bạn có 0 phần tử trong đó để bạn không thể truy cập big[i].

Set kích thước vector trước khi vòng lặp, hoặc trong các nhà xây dựng hay như thế này:

big.resize(ruleNum); 

Hoặc bạn có thể đẩy một vector trống trong mỗi bước lặp:

big.push_back(vector<string>()); 

Bạn không cũng cần các dấu ngoặc đơn xung quanh big[i].

3

Bạn có thể làm như sau:

string line; 
vector <vector<string> > big; //BTW:In C++11, you can skip the space between > and > 

string currStr; 
for (int i = 0; i < ruleNum; i++){ 
    getline(cin, line); 
    stringstream ss(line); 
    vector<string> buf; 
    while (ss >> currStr){ 
     buf.push_back(buf); 
    } 
    big.push_back(buf); 
} 
+0

Không cần khai báo 'buf' bên ngoài vòng lặp bên ngoài, và thực tế bạn quên xóa nó bên trong vòng lặp vì cái đó. –

+0

@KonradRudolph Bạn nói đúng, tôi đã bất cẩn, chỉ cần cập nhật mã. Cảm ơn! – taocp

+0

Haha, bây giờ bạn đang làm công việc không cần thiết, vectơ được định nghĩa lại mỗi lần và do đó trống rỗng, không cần phải 'clear()' nó. –

1
   vector<vector<string> > v; 

để push_back vào vectơ của vectơ, chúng tôi sẽ push_back chuỗi trong vector nội bộ và push_back vector nội vào vector bên ngoài.

Mã đơn giản để hiển thị việc triển khai: enter code here vectơ> v; vectơ s;

s.push_back("Stack"); 
s.push_back("oveflow");` 
s.push_back("c++"); 
// now push_back the entire vector "s" into "v" 
v.push_back(s); 
Các vấn đề liên quan