В докладе посмотрим на старые проверенные контейнеры из С++03, на новые из С++11/14, обсудим, какими контейнерами когда и зачем стоит пользоваться. Вместе с контейнерами взглянем на их окружение – алгоритмы и итераторы
2. Хитрости STL контейнеров
Знакомимся?
Максим, старший инженер-разработчик в компании EPAM
Systems.
В настоящее время участвую в разработке системы
иерархического хранения и репликации данных.
6. Хитрости STL контейнеров
Последовательные контейнеры
● template<class T, class Allocator = std::allocator<T>>
class vector;
● template<class T, class Allocator = std::allocator<T>>
class list;
● template<class T, class Allocator = std::allocator<T>>
class forward_list;
● template<class T, class Allocator = std::allocator<T>>
class deque;
7. Хитрости STL контейнеров
Упорядоченые ассоциативные контейнеры
● template<class Key, class Compare, class Allocator> class set;
● template<class Key, class Compare, class Allocator> class
multi_set;
● template<class Key, class T, class Compare, class Allocator>
class map;
● template<class Key, class T, class Compare, class Allocator>
class multi_map;
8. Хитрости STL контейнеров
Неупорядоченые ассоциативные контейнеры
● template<class Key, class Hash, class KeyEqual, class Allocator>
class unordered_set;
● template<class Key, class Compare, class Allocator> class
unordered_multiset;
● template<class Key, class T, class Hash, class KeyEqual,
class Allocator> class unordered_map;
● template<class Key, class T, class Hash, class KeyEqual,
class Allocator> class unordered_multimap;
9. Хитрости STL контейнеров
Адаптеры контейнеров
● template<class T, class Container> class stack;
● template<class T, class Container> class queue;
● template<class T, class Container, class Compare>
class priority_queue;
10. Хитрости STL контейнеров
Почти контейнеры
● template<class T, std::size_t N> struct array;
● T[N]
● template<class C, class Traits, class Allocator> class
basic_string;
● string, wstring, u16string, u32string
● vector<bool>
● template<std::size_t N> bitset;
20. Хитрости STL контейнеров
remove, remove_if, unique
не изменяют размер последовательности
new_end = remove_if(c.begin(), c.end(), pred);
c.erase(new_end, c.end());
21. Хитрости STL контейнеров
Советы
● не полагаться на оценки - измерять
● выбирать контейнер исходя из операций
● для ассоциативных - unordered_*, если не нужен порядок
● по умолчанию использовать вектор
● …
● PROFIT!