C++ C++;迭代器、默认初始化以及用作未初始化哨兵的内容

C++ C++;迭代器、默认初始化以及用作未初始化哨兵的内容,c++,iterator,containers,C++,Iterator,Containers,上下文 我有一个自定义的模板容器类,它由一个映射和向量组合而成。映射将字符串解析为序数,向量将序数(仅完成从初始字符串到序数的查找,将来的引用是到向量)解析为条目。这些条目被侵入式修改,以包含一个abool“赋值”和一个迭代器类型,迭代器类型是容器类映射的常量迭代器 我的容器类将使用的序列化代码(它模拟boost::serialization)将我的容器类序列化到网络中的节点。序列化迭代器是不可能的,或者是一堆蠕虫,一旦向量和映射在远程站点上序列化,我就可以轻松地重新生成它们 问题 我需要进行默

上下文

我有一个自定义的模板容器类,它由一个映射和向量组合而成。映射将字符串解析为序数,向量将序数(仅完成从初始字符串到序数的查找,将来的引用是到向量)解析为条目。这些条目被侵入式修改,以包含一个a
bool
“赋值”和一个迭代器类型,迭代器类型是容器类映射的常量迭代器

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

问题

我需要进行默认初始化,并且能够测试迭代器是否没有被分配到(如果分配了迭代器,那么它是有效的,如果没有,那么它是无效的)。既然映射迭代器在对其执行操作时不会失效(当然,除非项目被删除:D),那么我是否可以假设
map::end()
是一个有效的哨兵(不管映射的状态如何——即它可能为空)来初始化

我将始终可以访问父映射,我只是不确定映射内容更改时它们的
end()
是否相同

我不想使用另一个级别的间接方法(--boost::optional)来实现我的目标,我宁愿放弃编译器检查来纠正逻辑,但如果我不需要的话,那就太好了

杂项

,但它的大部分内容似乎毫无意义。根据g++和clangg++的规定,为迭代器分配NULL是无效的


类似的问题,但它关注迭代器的常见用例,通常倾向于使用迭代器进行迭代,当然在这种用例中,容器的状态并不意味着在迭代进行时改变

你的想法基本上是对的。映射迭代器只有在其指向的元素被删除时才会失效
map.end()
不指向元素,因此永远不会失效


不过,它不是映射迭代器的默认值。每个贴图对象都有自己的
end()
,它们是不可比较的。这对你来说应该不是问题;只是要小心。

这些条目被侵入式修改,以包含一个bool“assigned”和一个迭代器类型,该迭代器类型是容器类映射的常量迭代器。-我不理解这一部分。它与boost侵入式的概念类似,所以借用了这里的术语。容器可以定义为
container
,然后从类模板中对条目进行子类化,以将bool和迭代器类型添加到条目中。因此,我正在向条目中添加内容,结果类型就是放入向量的类型,boost::intrusive对它所包含的条目也执行相同的操作。@Hassan:当然,这只适用于从不尝试序列化和
end()
迭代器的情况。