C++ 迭代器是否可能有间隙而不是线性的?

Is it possible for a C++ iterator to have gaps and not be linear?

我写了一个 C++ 迭代器来遍历 std::string,它是 UTF-8。

迭代器的想法是 return char32_t 个字符而不是字节。迭代器可用于前进或后退。我也可以倒带,我想相当于 rbegin().

由于一个字符可以跨越多个字节,我在 std::string 中的位置可能 跳跃 2、3 或 4 个字节(如果字符无效,库将抛出遇到)。

这也意味着到某个字符的距离并不总是一一递增。换句话说,++it 可以将位置增加 1 到 4 的数字,--it 以类似的方式反向减去。

这是 C++ 迭代器的 expected/legal 行为吗?

除了迭代器之外,C++ 中的许多算法同样适用于普通指针。 std::copy 将使用普通指针,就好了。 std::find_if也会很开心。等等。

幸运的是 std::copy 在您提供给它的指针上调用 ++ 运算符。好吧,你猜怎么着?将一堆 int * 传递给 std::copy 会导致实际指针增加 sizeof(int),而不是 1.

std::copy 不在乎。

迭代器的属性及其要求根据逻辑结果[=42=定义]逻辑效果 各种运算符导致发生的事情(以及哪些运算符对给定的迭代器有效)。迭代器的内部实现是否将内部值(以某种方式表示迭代器的值增加 1、2、4 或 42)并不重要。请注意,反向迭代器导致实际内部指针通过其 ++ 运算符重载 递减

如果您的自定义迭代器实现了 ++--*[]+- 运算符(无论哪个适合您的迭代器)满足其指定迭代器类别的所有要求,那么这些运算符对代表您的迭代器的实际原始指针值的实际影响是无关紧要的。

你的问题的答案如下,假设你的自定义迭代器是随机访问迭代器:如果所有必需的运算符重载满足随机访问迭代器的所有要求,那么对底层指针值的实际影响是无关紧要。

这同样适用于任何迭代器类别,而不仅仅是随机访问。