自定义C++迭代器是否允许步长不固定的非线性跳跃行为?
结论
你设计的这款UTF-8字符迭代器完全符合C++标准对迭代器的规范要求,属于合法实现。
核心依据
C++迭代器的行为约束只和其声明的迭代器分类绑定,和底层存储的偏移量逻辑无关:
- 迭代器的
++/--操作的语义是逻辑上移动到下一个/上一个元素,从来没有要求底层存储地址的偏移量必须每次固定加1。举个常见的例子:std::list的迭代器每次++都会跳转到下一个链表节点的地址,偏移量远大于1,仍然是完全合规的双向迭代器。 - 你实现了双向移动、回退能力,只要将迭代器明确声明为双向迭代器分类,就满足了对应分类的所有强制要求。
- 只有随机访问迭代器才要求支持常量时间的
it += n、it1 - it2等偏移和距离计算操作,你不需要也不可能满足这类要求(UTF-8字符序列计算两个位置的距离必须遍历中间所有字符,无法做到常量时间),只要不把迭代器归类为随机访问迭代器就没有任何问题。
其他细节的合法性说明
- 你提到的「迭代次数和底层字节偏移量不相等」完全不违反规范,迭代器的逻辑距离只和
++的调用次数挂钩,和底层字节偏移没有任何绑定关系。 - 遇到非法UTF-8序列时抛出异常也符合要求,C++标准允许迭代器操作在遇到非法状态时抛出异常,只要你在文档中明确说明该行为即可。
内容的提问来源于stack exchange,提问作者Alexis Wilke
相关产品推荐
相关产品推荐

