Unordered Map - similar to maps, unordered maps are associative containers that store key-value pairs. However, the unordered map is implemented using a hash table instead of a tree, which allows for 0 (1) find and remove. The drawback is that the elements are no longer ordered, so it does not support find Min or find Max, and cannot produce a sorted output using iterator traversal. Implement an unordered map ADT using a hash table (separate chaining or double hashing) as the underlying data structure. You may use std libraries for the linked list (separate chaining) and hash functions. If the hash table becomes overloaded (1 > 0.5) it should allocate more space and rehash all the existing elements. Don't forget the big 5! mapped_type& operator () (const key_type& k); if k matches the key of an element in the container, the function returns a reference to its mapped value. If k does not match the key of any element, insert a new key-value pair with key k and value constructed using mapped type default constructor and return a reference to the new mapped_type object. Pair insert (const value_type& val); о insert val into the unordered map. Return a pair object whose first element is either an iterator pointing to the newly inserted element or a pre-existing element with equivalent key, and a bool value indicating if the new element was successful inserted or not (false if the key already exists). int erase (const key_type& k); о remove the element with key k from the map. Return 1 if erase succeeded and 0 if it failed (because k did not exist). void clear() noexcept; remove and destroy all elements in the container. • iterator find (const key_type& k); ○ search container for element with key k, return an iterator to it if found, otherwise return iterator to unordered_map: : end. bool contains (const key_type& k); ○ search container for element with key k, return true if found, false otherwise. . bool empty() const noexcept; ○ return bool indicating whether or not the container is empty. int size() const noexcept; о return number of elements in the container. int max size () const noexcept; Return maximum number of elements the container can hold As with the map, unordered map must provide an iterator. However, the unordered map iterator need not print the elements in order, it can simply traverse elements of the hash table (skipping empty spots). See the C++ std::unordered_map reference: https://cplusplus.com/reference/unordered map/unordered map/for further details and usage. Part 3: Programming problems Use your unordered map to solve the following leetcodes, provide your solution code: two sum, longest substring without repeating characters substring with concatenation of all words Use your map (tree implementation) to solve: Sliding window maximum