2012-12-20 89 views
18

Tôi có một câu hỏi về cách tắt mới của định nghĩa vectơ trong C++ 11. Giả sử tôi có lớp sauC++ 11 khởi tạo vector trong một cuộc gọi hàm

struct Tester{ 

    vector< vector<int> > data; 

    Tester(){ 
    data = vector< vector<int> >(); 
    } 

    void add(vector<int> datum){ 
    data.push_back(datum); 
    } 

}; 

Sau đó, các công trình sau đây như mong đợi:

int main(){ 
    Tester test = Tester(); 
    vector<int> datum = vector<int>{1,2,3}; 
    test.add(datum); 
} 

nhưng điều này không:

int main(){ 
    Tester test = Tester(); 
    test.add(vector<int>{1,2,3}); 
} 

Có thể ai đó xin giải thích sự khác biệt đối với tôi? Làm thế nào tôi có thể làm các phím tắt tôi cố gắng trong chính thứ hai()?

+1

C++ 11 cho phép bạn rời khỏi không gian giữa mẫu dấu ngoặc: 'vector >' là hợp pháp. – zneak

+0

Bạn cũng nên đăng lỗi mà bạn nhận được với lần thử thứ hai của mình. Tắt đầu của tôi và không có trình biên dịch C++ 11 trong tay, tôi nghĩ nó sẽ làm việc với một trong hai danh sách khởi tạo ('test.add ({1,2,3})') hoặc với các dấu ngoặc đơn arount nó (' test.add (vector ({1,2,3})) '). – zneak

+6

'dữ liệu = vector < vector>();' là hoàn toàn thừa và có thể chỉ ra một sự hiểu lầm cơ bản trong C + + constructor và khởi tạo. – PlasmaHH

Trả lời

21

Mã của bạn có vẻ không sao nhưng trình biên dịch bạn đang sử dụng không phải (có vẻ như cũ).

Nhân tiện, bạn đang làm quá nhiều.

Đây là nên đủ:

vector<int> datum{1,2,3}; //initialization 

test.add({1,2,3}); //create vector<int> on the fly and pass it to add() 

Đừng quên để cập nhật trình biên dịch của bạn.

Ngoài ra, dòng data = vector< vector<int> >(); cũng quá nhiều. Nó không cần thiết. Vector được xây dựng tự động, có nghĩa là bạn có thể để lại hàm tạo của lớp của bạn trống rỗng, hoặc không có nó ở tất cả, vì nó không làm bất cứ điều gì anyway.

+0

Cảm ơn! Đó là những phím tắt đẹp. Tôi đồng ý rằng nhà xây dựng là không cần thiết - tôi đã chỉ rõ ràng. Hóa ra mã ban đầu của tôi không hoạt động; Tôi phải đã không lưu một bộ đệm emacs hoặc một cái gì đó. – andyInCambridge

1

Nếu bạn muốn tránh sao chép dữ liệu:

#include <vector> 
#include <iostream> 

using namespace std; 

struct Tester 
{ 
    vector< vector<int> > data; 

    Tester() 
    { 
     data = vector< vector<int> >(); 
    } 

    void add(vector<int> && datum) 
    { 
     data.push_back(std::move(datum)); 
    } 

}; 


int main() 
{ 
    Tester test = Tester(); 
    test.add(vector<int>{1,2,3}); 

    for(const auto &v : test.data[0]) 
     std::cout << v << std::endl; 
} 
Các vấn đề liên quan