2011-12-17 30 views
9

Cho phép nói rằng tôi có một đối tượng mà tôi được phân bổ động. Nếu tôi đẩy nó vào một vector STL, một tham chiếu có được chèn vào vectơ hoặc bản sao của đối tượng này không?std :: vector chèn một bản sao hoặc tham chiếu của một đối tượng?

Đó là một câu hỏi chung. Ví dụ:

class vec { 
vector<obj> vec; 
void addToVec(obj a) { 
    // insert a into vec 
} 
    ... 
    ... 
    ... 
} 

obj* a = new obj; 
vec* v = new vec; 
vec.addToVec(a); 

Nếu tôi xóa v, cũng sẽ phản đối chết không?

+1

Vui lòng hiển thị mã mà bạn đang nghĩ đến :-) –

+4

Bên thuyết giảng của tôi sắp ra mắt và tôi cảm thấy tôi phải nói với bạn rằng bạn rất có thể không có nghĩa là STL mà là thư viện chuẩn C++. – Corbin

+1

Thư viện chuẩn C++ đã áp dụng STL cho các thùng chứa và các thuật toán của nó. Vì vậy, về mặt kỹ thuật, một vector STL giống như một vector thư viện C++. –

Trả lời

8

một tham chiếu có được chèn vào vectơ hoặc bản sao của đối tượng này không?

Sao chép (có nghĩa là class bạn nên sao chép có thể lỗi khác biên dịch).

Làm rõ: Không thể chỉ định tham chiếu trong std::vector<>. Ngoài ra, đối tượng ở đây có ý nghĩa rộng hơn, nó có thể là một biến bình thường hoặc một con trỏ, nhưng std::vector<> chỉ chấp nhận bản sao.

Cập nhật: Đăng C++ 11, hầu hết các vùng chứa tiêu chuẩn cung cấp std::move() của đối tượng bằng cách sử dụng "phương pháp API ba chiều rvalue"; nơi một bản sao có thể không được thực hiện.

+0

Tôi đã rất ngạc nhiên, tôi nghĩ trình biên dịch sẽ tối ưu hóa hoạt động sao chép trong một số trường hợp, nhưng không tìm thấy: http://ideone.com/b4fpc ngay cả với g ++ -O6 – matiu

+0

Điều này thể hiện mức độ đắt đỏ hoạt động sao chép có thể bằng cách sao chép một đối tượng 131 KB: http://ideone.com/UNKyr – matiu

2

Bạn đã kiểm tra reference:

void push_back (const T& x); 

Thêm yếu tố vào cuối

Thêm một yếu tố mới vào cuối của vector, sau yếu tố cuối cùng như hiện nay. Nội dung của phần tử mới này được khởi tạo thành bản sao của x.

Điều này làm tăng kích thước vectơ một cách hiệu quả, gây ra sự phân bổ lại dung lượng lưu trữ nội bộ nếu kích thước vectơ bằng với dung lượng véc tơ trước cuộc gọi. Tái phân bổ vô hiệu hóa tất cả các vòng lặp thu được trước đó, tài liệu tham khảo và gợi ý

7

Nếu bạn có một đối tượng kiểu T mà bạn đã được cấp phát động và bạn đẩy một con trỏ đến đối tượng lên một std::vector<T*>, sau đó một bản sao của con trỏ là bị đẩy. Nếu bạn dereference con trỏ và đẩy kết quả vào một std::vector<T>, sau đó một bản sao của đối tượng được thực hiện. Bộ sưu tập luôn tạo bản sao. Vì vậy, các bộ sưu tập các con trỏ tạo các bản sao của con trỏ và các bộ sưu tập các cá thể lớp làm cho các bản sao của các cá thể đó (sử dụng bản sao xây dựng IIRC).

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