Поделиться через


Контейнеры (современный C++)

По умолчанию следует использовать вектор как последовательный контейнер по умолчанию в C++. Это эквивалент 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";

Если необходима оптимизация производительности, можно использовать:

  1. тип массива при внедрении очень важен, например как член класса.

  2. неупорядоченные ассоциативные контейнеры (unordered_map, et al.). Понизьте рабочей нагрузки для каждого элемента (главную) и поиска константа- времени (потенциально главный, иногда (значительные). Более крепко правильного использования и эффективно, из-за неудобств и изображений краев.

  3. сортируемый вектор. (См. Алгоритмы).

Не используйте массивы 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 C++ в Visual Studio 2010, Visual C++ в Visual Studio 2012 и Visual C++ в Visual Studio 2013 по умолчанию _SECURE_SCL равно 0 (теперь называется _ITERATOR_DEBUG_LEVEL).

x86 размеров контейнера (байт)

VC9 с пакетом обновления 1 (SP1)

VC9 с пакетом обновления 1 (SP1)

SCL=0

VC10

VC11

vector<int>

24

16

16

12

array<int, 5>

20

20

20

20

вывести из очереди <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 с пакетом обновления 1 (SP1)

VC9 с пакетом обновления 1 (SP1)

SCL=0

VC10

VC11

vector<int>

48

32

32

24

array<int, 5>

20

20

20

20

вывести из очереди <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

См. также

Другие ресурсы

Возвращение к C++ (современный C++)

Справочник по языку C++

Справочник по стандартной библиотеке C++