コンテナー (Modern C++)
既定では、C++ の既定の順次コンテナーとして vector を使用します。 これは、他の言語の List<T> と同じです。
vector<string> v;
v.push_back( "Geddy Lee" );
既定の連想コンテナーとしては map (unordered_map ではなく) を使用します。 低次元の場合およびデータの重複を許す場合は、set、multimap、multiset を使用します。
map<string, string> phone_book;
// ...
phone_book["Alex Lifeson"] = "+1 (416) 555-1212";
パフォーマンスの最適化が必要な場合は、次の使用を検討します。
配列型。(たとえばクラス メンバーとして) 埋め込むことが重要な場合に使用します。
順序なし連想コンテナー (unordered_map など)。要素ごとのオーバーヘッドが小さく (主な理由)、検索時間が一定です (主な理由になる可能性あり、場合によっては副次的な理由)。 不便でエッジがシャープなため、正しく効率的に使用するのは困難です。
並べ替えられたベクター。(「アルゴリズム」を参照してください)。
C 言語の配列を使用しないでください (従来の API の場合は、f( vec.data(), vec.size() ); を使用します)。
コンテナーに関する他のトピックについては、「STL コンテナー」を参照してください。
コンテナー サイズ
次の表は、x86 および x64 プラットフォームのコンテナー サイズ (バイト単位) を示しています (この目的では、32 ビット ARM は x86 と同じです)。デバッグ モードには領域と時間を消費するチェック メカニズムが含まれているため、これらの表はリリース モードをカバーしています。Visual C++ 2008 SP1 に関する独立した列では、_SECURE_SCL の既定値が 1 になっています。Visual C++ 2008 SP1 では、速度を最大限に高めるために _SECURE_SCL が手動で 0 に設定されています。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 |
array<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 |
array<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 |