2009-04-16 6 views
22

Tôi đang viết một số mã chống lại một C++ API mà mất vectơ của vectơ của vectơ, và nó ngày càng tẻ nhạt để viết mã như sau khắp nơi:C++ literals vector, hoặc một cái gì đó giống như họ

vector<string> vs1; 
vs1.push_back("x"); 
vs1.push_back("y"); 
... 
vector<string> vs2; 
... 
vector<vector<string> > vvs1; 
vvs1.push_back(vs1); 
vvs1.push_back(vs2); 
... 
vector<vector<string> > vvs2; 
... 
vector<vector<vector<string> > > vvvs; 
vvvs.push_back(vvs1); 
vvvs.push_back(vvs2); 
... 

C++ có cú pháp vectơ không? I.e., giống như:

vector<vector<vector<string>>> vvvs = 
    { { {"x","y", ... }, ... }, ... } 

Có cách nào không tích hợp để thực hiện việc này không?

+1

Không ai bắt được dấu ngoặc đơn xấu của tôi! –

+1

Tôi có thể chưa bắt được dấu ngoặc của bạn nhưng tôi chắc chắn đã bắt gặp các tên biến không khớp và dấu chấm phẩy bị thiếu! ;) –

+0

gần như, nhưng không hoàn toàn ... –

Trả lời

34

Trong C++0x bạn will be able sử dụng cú pháp mong muốn của bạn:

vector<vector<vector<string> > > vvvs = 
    { { {"x","y", ... }, ... }, ... }; 

Nhưng trong C ngày nay ++ bạn được giới hạn sử dụng boost.assign cho phép bạn làm:

vector<string> vs1; 
vs1 += "x", "y", ...; 
vector<string> vs2; 
... 
vector<vector<string> > vvs1; 
vvs1 += vs1, vs2, ...; 
vector<vector<string> > vvs2; 
... 
vector<vector<vector<string> > > vvvs; 
vvvs += vvs1, vvs2, ...; 

... hoặc sử dụng Qt's containers mà cho phép bạn làm điều đó một lần:

QVector<QVector<QVector<string> > > vvvs = 
    QVector<QVector<QVector<string> > >() << (
     QVector<QVector<string> >() << (
      QVector<string>() << "x", "y", ...) << 
      ...) << 
     ... 
    ; 

Tùy chọn bán lành mạnh khác, ít nhất là cho vectơ bằng phẳng, là xây dựng từ một mảng:

string a[] = { "x", "y", "z" }; 
vector<string> vec(a, a + 3); 
+3

Tôi khuyên bạn nên sử dụng cách tự động truy xuất kích thước mảng, như được đăng bởi litb ở đây: http://stackoverflow.com/questions/437150/can-someone-explain -mẫu-mẫu-mã-đó-cho-cho-tôi-kích thước-của-một-mảng –

+2

Đúng vậy. Didnt muốn làm phức tạp câu trả lời. –

3

Về cơ bản, không có cú pháp dựng sẵn để làm điều đó, vì C++ không biết về véc-tơ ether; chúng chỉ từ một thư viện tiện lợi.

Điều đó nói rằng, nếu bạn đang tải lên một cấu trúc dữ liệu phức tạp, bạn nên tải nó từ một tập tin hoặc một cái gì đó tương tự anyway; mã quá giòn.

+0

không chỉ nên một cấu trúc như vậy không được hardcoded, nhưng tôi nghĩ rằng thực tế là vectơ lồng nhau đang được thao tác trực tiếp là một mùi mã ... có lẽ nên có một lớp đóng gói một số hoặc tất cả điều đó. – rmeador

+1

STL không chỉ là thư viện _convenient_, đó là thư viện ** tiêu chuẩn **. C++ được xây dựng trong các lớp, nhưng điều đó không có nghĩa là các phần được xây dựng trong chân không. –

+1

Bạn nói đúng, tôi không tìm thấy STL tất cả những thư viện tiện lợi đó. –