Post on 06-Jan-2017
Хитрости STL контейнеров
Знакомимся?
Максим, старший инженер-разработчик в компании EPAM Systems.
В настоящее время участвую в разработке системы иерархического хранения и репликации данных.
Хитрости 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 контейнеров
Сложность операций[] 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 контейнеров
Новое в итераторах● begin/end● cbegin/cend● next/prev● move_iterator● make_move_iterator
Хитрости STL контейнеров
remove, remove_if, uniqueне изменяют размер последовательностиnew_end = remove_if(c.begin(), c.end(), pred);c.erase(new_end, c.end());
Хитрости STL контейнеров
Советы● не полагаться на оценки - измерять● выбирать контейнер исходя из операций● для ассоциативных - unordered_*, если не нужен порядок● по умолчанию использовать вектор ● …● PROFIT!