bool skiplist<KEY, VALUE>::erase_impl(NODE *p_cur, KEY &p_key, short p_lvl) { if(p_cur->key == p_key) { m_delete_ok = true; return true; } if ( p_cur->links[p_lvl] == nullptr || p_cur->links[p_lvl]->key > p_key ) { if ( p_lvl == 0 ) { return false; } erase_impl ( p_cur, p_key, p_lvl - 1 ); return false; } NODE *to_delete {nullptr}; while(p_lvl >= 0 && erase_impl ( p_cur->links[p_lvl], p_key, p_lvl )) { to_delete = p_cur->links[p_lvl]; p_cur->links[p_lvl] = to_delete->links[p_lvl]; --p_lvl; } return false; }
iterator erase(const_iterator first, const_iterator last) { size_t index = first - begin(); size_t erased_count = 0; for (; first != last; ++first) ++erased_count; return erase_impl(index, erased_count); }
bool skiplist<KEY, VALUE>::erase(KEY p_key) { m_delete_ok = false; erase_impl(m_head, p_key, m_maxLevel - 1); return m_delete_ok; }
iterator erase(const_iterator position) { return erase_impl(position - begin(), 1); }