Beispiel #1
0
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;
}
Beispiel #2
0
 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);
 }
Beispiel #3
0
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;
}
Beispiel #4
0
 iterator erase(const_iterator position)
 {
     return erase_impl(position - begin(), 1);
 }