容器(现代 C++)
默认情况下,将向量作为 C++ 中的默认顺序容器使用。 这相当于其他语言的列表<T>。
vector<string> v;
v.push_back( "Geddy Lee" );
使用 map(不是 unordered_map)作为默认关联容器。 将设置、多重映射、多集用于退化和多用例。
map<string, string> phone_book;
// ...
phone_book["Alex Lifeson"] = "+1 (416) 555-1212";
需要性能优化时,请考虑使用:
正在嵌入(例如作为类成员)的数组类型很重要。
无序的关联容器 (无序的映射,等等):降低各元素的开销 (主要) 和常数时查找 (可能是主要,有时次要)。 由于不便和锋利的边缘,更加难以正确且有效地使用。
已排序的矢量。(请参见:算法。)
不要使用 C 数组。(对于较早的 API,使用 f( vec.data(), vec.size() );。)
有关容器的另外一篇文章信息,请参见STL 容器。
容器大小
下表显示了容器的大小,以字节为单位,适用于 x86 和 x64 平台。(出于这些目的,32 位 ARM 与 x86 等效。)这些表涉及释放模式,因为调试模式包含消耗空间和时间的检查机械设备。这些单独的列针对的是 Visual C++ 2008 SP1,其中 _SECURE_SCL 默认为 1,同时也将针对 _SECURE_SCL 手动设置为 0 以达到最大速度的 Visual C++ 2008 SP1。Visual Studio 2010 中的 Visual C++、Visual Studio 2012 中的 Visual C++ 和 Visual Studio 2013 中的 Visual C++ 将 _SECURE_SCL 默认为 0(现在称为 _ITERATOR_DEBUG_LEVEL)。
x86 容器大小(字节) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
vector<int> |
24 |
16 |
16 |
12 |
数组 <int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
32 |
32 |
24 |
20 |
forward_list<int> |
不适用 |
不适用 |
8 |
4 |
list<int> |
28 |
12 |
12 |
8 |
priority_queue<int> |
28 |
20 |
20 |
16 |
queue<int> |
32 |
32 |
24 |
20 |
stack<int> |
32 |
32 |
24 |
20 |
pair<int,int> |
8 |
8 |
8 |
8 |
tuple<int, int, int> |
16 |
16 |
16 |
12 |
map<int, int> |
32 |
12 |
16 |
8 |
multimap<int, int> |
32 |
12 |
16 |
8 |
set<int> |
32 |
12 |
16 |
8 |
multiset<int> |
32 |
12 |
16 |
8 |
hash_map<int,int> |
72 |
44 |
44 |
32 |
hash_multimap<int,int> |
72 |
44 |
44 |
32 |
hash_set<int> |
72 |
44 |
44 |
32 |
hash_multiset<int> |
72 |
44 |
44 |
32 |
unordered_map<int, int> |
72 |
44 |
44 |
32 |
unordered_multimap<int, int> |
72 |
44 |
44 |
32 |
unordered_set<int> |
72 |
44 |
44 |
32 |
unordered_multiset<int> |
72 |
44 |
44 |
32 |
string |
28 |
28 |
28 |
24 |
wstring |
28 |
28 |
28 |
24 |
x64 容器大小(字节) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
vector<int> |
48 |
32 |
32 |
24 |
数组 <int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
64 |
64 |
48 |
40 |
forward_list<int> |
不适用 |
不适用 |
16 |
8 |
list<int> |
56 |
24 |
24 |
16 |
priority_queue<int> |
56 |
40 |
40 |
32 |
queue<int> |
64 |
64 |
48 |
40 |
stack<int> |
64 |
64 |
48 |
40 |
pair<int,int> |
8 |
8 |
8 |
8 |
tuple<int, int, int> |
16 |
16 |
16 |
12 |
map<int, int> |
64 |
24 |
32 |
16 |
multimap<int, int> |
64 |
24 |
32 |
16 |
set<int> |
64 |
24 |
32 |
16 |
multiset<int> |
64 |
24 |
32 |
16 |
hash_map<int,int> |
144 |
88 |
88 |
64 |
hash_multimap<int,int> |
144 |
88 |
88 |
64 |
hash_set<int> |
144 |
88 |
88 |
64 |
hash_multiset<int> |
144 |
88 |
88 |
64 |
unordered_map<int, int> |
144 |
88 |
88 |
64 |
unordered_multimap<int, int> |
144 |
88 |
88 |
64 |
unordered_set<int> |
144 |
88 |
88 |
64 |
unordered_multiset<int> |
144 |
88 |
88 |
64 |
string |
40 |
40 |
40 |
32 |
wstring |
40 |
40 |
40 |
32 |