gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:46:51 25 4
gpt4 key购买 nike

我写了一个 C++ 迭代器来遍历一个 UTF-8 格式的 std::string

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

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

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

这是 C++ 迭代器的预期/合法行为吗?

最佳答案

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

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

std::copy 不会在意。

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

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

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

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

关于c++ - C++ 迭代器是否可能有间隙而不是线性的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69869100/

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