微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 关联容器迭代器增量如何工作?

如何解决C++ 关联容器迭代器增量如何工作?

对于像 std::setstd::multisetstd::mapstd::multimap 迭代器这样的 C++ STL 关联容器。

iteratorName++/iteratorName-- 是如何工作的?

每个元素是否有 2 个指向比自身少/多的指针?如果是这样,它是如何保存这些信息的?

它需要 O(1),摊销时间还是对数时间?

撇开问题不谈,begin() 方法是如何工作的?每次插入/删除都会考虑吗?

解决方法

C++ 关联容器迭代器增量如何工作?

C++ 语言没有指定容器的实现方式。

在实践中,已排序的关联容器被实现为红黑树。我将展示一个实现作为示例。 Libstdc++ 映射迭代器包含一个指向树节点的指针。以下是增量的实现方式(为了可读性由我修改):

// modified from libstdc++
// license: lgpl
rb_tree_increment(rb_tree_node_base* x)
{
    if (x->right != 0) 
    {
        x = x->right;
        while (x->left != 0)
            x = x->left;
    }
    else 
    {
        rb_tree_node_base* y = x->parent;
        while (x == y->right) 
        {
            x = y;
            y = y->parent;
        }
        if (x->right != y)
            x = y;
    }
    return x;
}

它需要 O(1),摊销时间还是对数时间?

所有迭代器操作都需要分摊 O(1)。所示实现的最坏情况非摊销复杂度是对数的。

begin() 方法是如何工作的?

正如您现在了解到的,您只需阅读实现即可,我将把它作为练习留给读者来找出答案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。