【发布时间】:2021-12-20 10:40:18
【问题描述】:
我编写了一个 C++ 迭代器来遍历 std::string,它是 UTF-8。
这个想法是让迭代器返回char32_t 字符而不是字节。迭代器可用于前进或后退。我也可以倒带,我想相当于rbegin()。
由于一个字符可以跨越多个字节,我在 std::string 中的位置可能跳跃 2、3 或 4 个字节(如果遇到无效字符,库将抛出)。
这也意味着到某个字符的距离并不总是一一递增。换句话说,++it 可以将位置增加一个从 1 到 4 的数字,--it 以类似的方式反向减去。
这是 C++ 迭代器的预期/合法行为吗?
【问题讨论】:
-
正如您所描述的,只要“位置”不可访问(是私有的),就没有“间隙”或“非线性”,因此作为双向迭代器显然没有问题。但是,它可能不能是 RandomAccessIterator。
-
另外,也许看看 Qt 中的 QString 如何处理 UTF 字符作为另一个例子。使用 QString,字符数据在访问器函数中被另一个类封装,而不是提供对底层数据的直接访问。
-
@Remarkod QString 处理 UTF-16 并且它们不能正确处理代理项(即它们为字符返回
unsigned short)。不过,也许 Qt v6 会增强这部分。所以实际上他们可以管理unsigned short的数组。 -
双向迭代器就是这样做的。想想
std::map,它是一个RB树,所以迭代可以跳过整个分支。 -
是的,这正是迭代器的用途:为可能不统一的数据结构提供统一。