gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:59:03 56 4
gpt4 key购买 nike

背景

我有一个自定义模板容器类,由 map 和 vector 组合而成。映射将字符串解析为序数, vector 将序数解析为条目(仅完成初始字符串到序数的查找, future 的引用是 vector )。这些条目被侵入性地修改为包含一个 bool “已分配”和 iterator_type,它是容器类映射的 const_iterator。

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

问题

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

我将始终可以访问父 map ,我只是不确定是否可用 end()与 map 内容变化相同。

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

杂项

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

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

最佳答案

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

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

关于C++ 迭代器、默认初始化以及用作未初始化哨兵的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5270401/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com