Хитрости STL контейнеров
Хитрости STL контейнеров
Максим Лысков
Минск, 2016
Хитрости STL контейнеров
Знакомимся?
Максим, старший инженер-разработчик в компании EPAM
Systems.
В настоящее время участвую в разработке системы
иерархического хранения и репликации данных.
Хитрости STL контейнеров
Хитрости STL контейнеров
Контейнер -
последовательность
однотипных элементов.
Хитрости STL контейнеров
Типы контейнеров:
● последовательные
● ассоциативные
● адаптеры контейнеров
● “почти” контейнеры
Хитрости 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;
Хитрости 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;
Хитрости 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;
Хитрости 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;
Хитрости 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;
Хитрости STL контейнеров
Типы внутри контейнера:
● value_type
● allocator_type
● size_type
● reference
● pointer
● ...
Хитрости STL контейнеров
Новое в операциях
● конструирование из initializer_list
● разница между vector<T>(n) и vector<T>{n}
● cbegin / cend
● data
● emplace / emplace_back / emplace_front
● swap
● shrink_to_fit
Хитрости STL контейнеров
Новое в операциях
● movable constructors
● move в push_*
Хитрости STL контейнеров
Сложность операций
[] list front back
vector O(1) O(n)+ O(1)+
list O(1) O(1) O(1)
forward_list O(1) O(1)
deque O(1) O(n)+ O(1) O(1)
Хитрости STL контейнеров
Сложность операций
[] list front back
map O(log(n)) O(log(n))
set O(log(n))
unordered_set O(1)
unordered_map O(1) O(1)
Хитрости STL контейнеров
Итераторы
Хитрости STL контейнеров
Классификация итераторов
Хитрости STL контейнеров
Новое в итераторах
● begin/end
● cbegin/cend
● next/prev
● move_iterator
● make_move_iterator
Хитрости STL контейнеров
Алгоритмы - функции над
последовательностями
элементов.
Хитрости STL контейнеров
remove, remove_if, unique
не изменяют размер последовательности
new_end = remove_if(c.begin(), c.end(), pred);
c.erase(new_end, c.end());
Хитрости STL контейнеров
Советы
● не полагаться на оценки - измерять
● выбирать контейнер исходя из операций
● для ассоциативных - unordered_*, если не нужен порядок
● по умолчанию использовать вектор
● …
● PROFIT!
Хитрости STL контейнеров
?
Хитрости STL контейнеров
Спасибо!

tricks of Stl containers