Đối với bất kỳ container chứa đối tượng thuộc loại T
, tiêu chuẩn (C++ 11 23.2.1/4) đòi hỏi rằng:
container_type::value_type
là T
container_type::reference
là một vế trái của T
, tức là một T&
container_type::const_reference
là một giá trị trái const của T
, tức là một const T&
pointer
và const_pointer
không thuộc bất kỳ yêu cầu nào trong số các yêu cầu Container
, chúng chỉ đơn giản là các kiểu chữ tiện lợi trong các vùng chứa tiêu chuẩn, được lấy từ bộ cấp phát của vùng chứa.
Vì vậy, để trả lời câu hỏi của bạn:
value_type
, reference
và const_reference
phải như bạn mong đợi, nếu không chứa không đáp ứng yêu cầu Container
. Lưu ý rằng điều này có nghĩa là (ví dụ: Herb Sutter points out), rằng std::vector<bool>
là không phải là một vùng chứa theo nghĩa tiêu chuẩn.
pointer
và const_pointer
là typedefs cho các loại cấp phát, vì vậy khi bạn có một container với cấp phát A
, họ sẽ khác với T*
và T const*
bất cứ khi nào std::allocator_traits<A>::pointer
và std::allocator_traits<A>::const_pointer
khác với họ.
Và để trực tiếp giải quyết các vấn đề mà các container tiêu chuẩn đáp ứng những yêu cầu Container
:
std::array<T>
làm, mỗi 23.3.2.1/3 (với một số ngoại lệ mà không ảnh hưởng đến typedefs trong câu hỏi)
std::deque<T>
làm, mỗi 23.3.3.1/2
std::forward_list<T>
làm, mỗi 23.3.4.1/2 (với một số ngoại lệ mà không ảnh hưởng đến typedefs trong câu hỏi)
std::list<T>
nai s, mỗi 23.3.5.1/2
std::vector<T>
không (ví T
khác hơn bool
), mỗi 23.3.6.1/2 (với một số ngoại lệ mà không ảnh hưởng đến typedefs trong câu hỏi)
std::set<T>
làm, mỗi 23,4. 6.1/2
std::multiset<T>
làm, mỗi 23.4.7.1/2
std::unrdered_set<T>
làm, mỗi 23.5.6.1/2
std::unordered_multiset<T>
làm, mỗi 23.5.7.1/2
std::basic_string<T>
chứa typedefs trong câu hỏi (để các loại chính xác) theo 21.4./5, mặc dù tiêu chuẩn không yêu cầu rõ ràng để đáp ứng các yêu cầu Container
. Lưu ý rằng value_type
phụ thuộc vào các đặc điểm của ký tự, vì vậy std::basic_string<T, MyTraits>
có thể có value_type
khác với T
.
std::[unorderd_][multi]map
không đủ điều kiện vì chúng lấy nhiều thông số mẫu bắt buộc và sử dụng chúng để tổng hợp value_type
.
std::valarray<T>
không đủ điều kiện vì chỉ cung cấp loại số value_type
và không có loại nào khác.
Đối với 'map' và' unordered_map', không có 'T'. 'value_type' là' cặp '. –
@Mike Seymour: chắc chắn, nhưng tôi nghĩ rằng bạn có câu hỏi – davidhigh