2014-12-03 14 views
5

Tôi muốn có một cái gì đó tương đương với một C++ std :: vector, nơi mà các đối tượng bên dưới là không thay đổi. Vì vậy, tôi có thể push_back() các mục để thêm chúng vào vectơ, vv. Std :: vector thực tế duy trì một mảng bên dưới lớn hơn kích thước của vectơ, chứa các đối tượng được tạo mặc định và khi bạn push_back(), nó một nhiệm vụ cho một phần tử trong mảng. Các đối tượng bất biến của tôi không có một hàm tạo mặc định, và phép gán là một hoạt động biến đổi, vì vậy nó cũng vậy.Một container có thể thay đổi của các đối tượng bất biến trong C++

Tôi có thể làm một vector<boost::optional<T>>, nhưng đó là một giao diện lộn xộn vì tôi chỉ muốn đặt các đối tượng được xây dựng hợp lệ vào vectơ và chỉ lấy các đối tượng đó ra khỏi vectơ.

Tôi nghĩ rằng tăng cường có một cái gì đó như thế này, nhưng tôi không thể tìm thấy nó. Có một cái gì đó như thế này tồn tại?

+2

Ít nhất trong C++ 11, vectơ hoạt động như bạn muốn. Bạn có thể sử dụng 'emplace_back()'. –

+0

Bạn có thể lưu trữ con trỏ thông minh đến các đối tượng bất biến thực sự trong vectơ của bạn không? – shuttle87

+1

Cách bạn mô tả 'vector ' không khớp chính xác với cách hoạt động của nó. Loại của bạn có di chuyển và/hoặc sao chép các nhà xây dựng? – hvd

Trả lời

4

Quan niệm của bạn về cách hoạt động của vector không chính xác.

Vectơ sử dụng trình phân bổ để cấp phát bộ nhớ thô. Bộ nhớ thô đó không chứa các đối tượng được tạo mặc định - nó chỉ là bộ nhớ thô.

Khi bạn thực hiện push_back (ví dụ), sau đó sử dụng vị trí new để tạo đối tượng vào bộ nhớ thô. Tương tự như vậy, khi bạn erase một đối tượng, nó sẽ kết thúc trực tiếp gọi destructor của nó để biến đối tượng trở lại vào bộ nhớ nguyên.

Với triển khai hiện tại (C++ 11 hoặc mới hơn) của std::vector, đối tượng của bạn không cần phải hỗ trợ xây dựng hoặc gán mặc định. Hỗ trợ xây dựng di chuyển và chuyển nhượng nên là đủ. Để sử dụng chúng, bạn muốn sử dụng emplace_back thay vì push_back.

+0

'push_back()' trên một rvalue cũng sử dụng xây dựng di chuyển. – Angew

+1

@Angew: True. Và tương tự, 'emplace_back' có thể làm một bản sao nếu bạn có kiểu không hỗ trợ di chuyển - nhưng tôi thích mã để phản ánh ý định thực sự, vì vậy nếu bạn định chọn loại di chuyển, tôi muốn xem 'emplace_back', ngay cả khi' push_back' thực sự hoạt động. –

+0

OK, tôi thích "mã ý bạn là gì" đào tạo suy nghĩ, vì vậy điều này có ý nghĩa hoàn hảo. – Angew

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