2015-10-01 20 views
11

Sự khác nhau giữa boost::container::vectorstd::vector là gì?Sự khác nhau giữa tăng :: container :: vector và std :: vector

+1

Tôi tìm thấy một câu hỏi có liên quan mà có lẽ câu trả lời này là tốt: http://stackoverflow.com/questions/22584685/difference-between-stdset-and-boostcontainerset – jfritz42

+1

IIRC, Boost.Container tương thích với Boost. Di chuyển, có nghĩa là các vùng chứa của nó hỗ trợ các ngữ nghĩa di chuyển mà không có C++ 11. – chris

+0

@ jfritz42 đã đồng ý, nơi nhận xét của tôi phù hợp hơn với bạn vì bạn đang sử dụng vectơ – sehe

Trả lời

9

Trường hợp bạn có thể cần phiên bản tăng thay vì phiên bản tiêu chuẩn là khi bạn gặp chuyên môn <bool>.

std::vector<bool> được triển khai dưới dạng bitet, nó không lưu trữ phần tử của nó dưới dạng mảng bool.

Điều này có nghĩa ví dụ đoạn mã sau sẽ không làm việc:

template<T> 
void handleElement(T &element); 

// suppose we get a bool vector: 
std::vector<bool> v = ....; 
// then this fails because v[i] is a proxy object 
handleElement(v[0]); 

boost::container::vector<bool> không có chuyên môn như vậy.

3

Có một số sự khác biệt mà tôi có thể biên dịch:

° Không có chuyên môn của boost::container::vector<bool> (nguồn @roeland)

decltype(std::vector<bool>(10)[0]) == std::_Bit_reference 
decltype(boost::container::vector<bool>(10)[0]) == bool& 

° Sử dụng cơ sở hạ tầng Boost cấp phát, trong đó (đặc biệt là trong C++ 1x) được linh hoạt hơn mà trình phân bổ tiêu chuẩn, không bỏ qua các đặc điểm nhất định được cung cấp bởi người cấp phát. (Nguồn: http://www.boost.org/doc/libs/1_59_0/doc/html/interprocess/allocators_containers.html#interprocess.allocators_containers.containers_explained.stl_container_requirements)

std::vector<double>::allocator_type == std::allocator<double> 
boost::container::vector<double>::alloctor_type == boost::container::new_allocator<double> 

Đặc biệt, chúng ta vẫn có thể xác định referencepointer loại là khác nhau từ T&T* (xem Is it still possible to customize STL vector's "reference" type?)

° Hỗ trợ cho container đệ quy (nguồn: Các Boost C++ Thư viện của Boris Schäling).

Triển khai STL cũ (cũ?) Không hỗ trợ các loại giá trị không đầy đủ (chúng không bắt buộc ở vị trí đầu tiên), đặc biệt trong các vùng chứa đệ quy.

using boost::container::vector; 

struct animal{ 
    vector<animal> children; // may not work with std::vector 
}; 

int main(){ 
    animal parent; 
    animal child1; 
    animal child2; 

    parent.children.push_back(child1); 
    parent.children.push_back(child2); 
} 

° std::vector là đặc điểm kỹ thuật không phải là triển khai. Chỉ có một triển khai thực hiện boost::container::vector trên tất cả các nền tảng, do đó có thể tạo nhiều giả định hơn (ví dụ: ban đầu std::vector không cần sử dụng bộ nhớ liền kề) (nguồn: Thư viện Boost C++ của Boris Schäling).

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