如何解决C++ 关联容器迭代器增量如何工作?
对于像 std::set
、std::multiset
、std::map
或 std::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 举报,一经查实,本站将立刻删除。