C ++迭代器,默认初始化以及用作未初始化的标记的内容

时间:2011-03-11 08:02:47

标签: c++ iterator containers

上下文

我有一个从地图和矢量放在一起的自定义模板容器类。映射将字符串解析为序数,并且向量将条目解析为条目(仅对序数查找进行初始字符串,将来对向量进行引用)。这些条目被侵入修改为包含一个bool“赋值”和一个iterator_type,它是容器类映射的const_iterator。

我的容器类将使用RCF的序列化代码(模型boost :: serialization)将我的容器类序列化到网络中的节点。序列化迭代器是不可能的,或者是一堆蠕虫,我可以轻松地重新生成它们,矢量和地图在远程站点上被序列化。

问题

我需要默认初始化,并且能够测试迭代器是否尚未分配(如果已分配它是有效的,如果不是,则无效)。由于map迭代器在对其执行的操作时不会失效(除非当然删除了项目:D)我是否认为map<x,y>::end()是有效的哨兵(无论地图的状态如何 - 即,它可能是空的)初始化为?

我将始终可以访问父地图,我只是不确定天气end()是否与地图内容更改相同。

我不想使用另一级别的间接(--ie,boost :: optional)来实现我的目标,我宁愿放弃编译器检查来纠正逻辑,但如果我不这样做会很好需要。

其它

This question exists,但其大部分内容似乎都没有意义。根据g ++和clang ++,为迭代器分配NULL是无效的。

This is another类似的问题,但它侧重于迭代器的常见用例,通常倾向于使用迭代器进行迭代,当然在这个用例中,容器的状态并不意味着在迭代进行的同时改变。

1 个答案:

答案 0 :(得分:2)

你基本上是理所当然的。只有在删除指向的元素时,映射迭代器才会失效。 map.end()未指向元素,因此永远不会失效。

但它不是地图迭代器的默认值。每个地图对象都有自己的end(),它们不具有可比性。这不应该是你的问题;小心点。