Containers and Docker¶
ChatGPT says: 1. Memory Management: Allocating and deallocating memory for the container and its elements must be handled properly. 1. Element Access: Containers must provide efficient means of accessing elements, such as indexing and iterators. 1. Insertion and Removal: Insertion and removal of elements must be handled efficiently. 1. Sorting and Searching: Containers must provide a way to sort and search through their elements. 1. Synchronization: If the container is used by multiple threads, synchronization must be handled properly. 1. Exception Handling: Code must handle exceptions properly in order to maintain integrity of the container.
Containers replicate structures very commonly used in programming: dynamic arrays (
vector), queues (queue), stacks (stack), heaps (priority_queue,make_heap), linked lists (list), trees (set), associative arrays (map)...
http://www.cplusplus.com/reference/stl/
Sequence containers¶
vector list deque array forward_list¶
Modifying a vector potentially invalidates all existing iterators. And
inserting an element can cause the whole container to be reallocated -- here be
dragons! It is, of course, doing a new on the heap under-the-hood, but this is
all nicely hidden via RAII. See A Presentation of the STL Vector
Container.
deque is not guaranteed to store all its elements in contiguous storage
locations but has efficient insertion and deletion of elements at the beginning
and end of a sequence. Adding to a deque doesn't invalidate existing iterators.
See An In Depth Study of the STL Deque
Container. A deque is a vector list of fixed-size vector chunks.
Unlike the other standard containers, array has a fixed size, and also
doesn't have resize/reserve/capacity/shrink_to_fit methods.
forward_list is a sequence container that allows constant time insert and
erase operations anywhere within the sequence. It has been designed with
efficiency in mind. By design, it is as efficient as a simple handwritten
C-style singly-linked list, and in fact is the only standard container to
deliberately lack a size member.
Associative containers¶
set map multiset multimap¶
multiset, set and map are typically implemented as binary search trees.
map is generally slower than unordered_map containers to access individual
elements by their key, but it allows the direct iteration on subsets based on
their order.
// map implementation
td::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> >, std::less<std::__cxx11::basic_string<char, std::char_traits<ch
ar>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> > >::_M_erase(std::_Rb_tree_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, int> >*):
// set implementation
std::_Rb_tree<int, int, std::_Identity<int>, std::less<int>, std::allocator<int> >::_M_erase(std::_Rb_tree_node<int>*):
See red-black tree.
Unordered associative containers¶
unordered_multiset unordered_map unordered_multimap unordered_set¶
unordered_set is faster than set to access individual elements
by their keys.
// unordered map/set implementation
std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,
Container adapters¶
stack queue priority_queue flat_map flat_set¶
By default, if no container class is specified for a particular
priority_queue class instantiation, the standard container vector is used.
priority_queue is a heap: Priority Queue is the implementation of Max Heap by default.
Complexities¶
- https://alyssaq.github.io/stl-complexities/
- https://www.geeksforgeeks.org/analysis-of-time-and-space-complexity-of-stl-containers/
- Red-black tree performance
The map
M is the implementation of self-balancing Red-Black Trees. The unordered_map M is the implementation of Hash Table which makes the complexity of operations like insert, delete and search to Theta(1).
Set implementations:
Set (set
s) is the implementation of Binary Search Trees. Unordered set (unordered_set S) is the implementation of Hash Table. Multiset (multiset S) is implementation of Red-Black trees. It is implemented using the linked list implementation of a stack. Queue in STL is implemented using a linked list. Vector is the implementation of dynamic arrays and uses new for memory allocation in heap.