Открыто
22.09.2017, 07:08
Реализовать структуру данных Skip list (список пропусков).
Подробное описание, как она работает, есть на Хабре.
Интерфейс класса подобен интерфейсу std::map, с теми же параметрами шаблона:
template <typename Key,
          typename Value,
          typename Compare = std::less<Key>,
          typename Alloc = std::allocator<std::pair<const Key,Value> > >
class skip_list {
    // ...
public:
    typedef ... iterator;
    typedef ... const_iterator;
    typedef std::pair<const Key, Value> value_type;
    skip_list();
    explicit skip_list(const Compare &comp, const Alloc &a = Alloc());
    skip_list(const skip_list &another);
    skip_list &operator=(const skip_list &another);
    iterator begin();
    const_iterator begin() const;
    iterator end();
    const_iterator end() const;
    bool empty() const;
    size_t size() const;
    Value &operator[](const Key &key);
    Value &at(const Key &key);
    const Value &at(const Key &key);
    std::pair<iterator, bool> insert(const value_type &);
    void erase(iterator position);
    size_type erase(const Key &key);
    void erase(iterator first, iterator last);
    void swap(skip_list &another);
    void clear();
    iterator find(const Key &key);
    const_iterator find(const Key &key) const;
};
template <typename K, typename V, typename C, typename A>
inline bool operator==(const skip_list<K,V,C,A> &x, const skip_list<K,V,C,A> &y) {
    // ....
}
template <typename K, typename V, typename C, typename A>
inline bool operator!=(const skip_list<K,V,C,A> &x, const skip_list<K,V,C,A> &y) {
    // ....
}
Реализовать ещё несколько методов из map:
    // ....
    typedef .... reverse_iterator;
    typedef .... const_reverse_iterator;
    reverse_iterator rbegin();
    reverse_iterator rend();
    const_reverse_iterator rbegin() const;
    const_reverse_iterator rend() const;
    size_t count(const Key &key) const;
Все операции должны быть проверены.