输入迭代器的示例`end()`实际上表示一个past-end-end
Example of Input Iterator where `end()` actually denotes one-past-the end?
我目前正在尝试理解一些想法。C 迭代器,我一直在想...
给定一个增量/单个通过/输入/输出迭代器,实际上可以存在这样的迭代器的一正式位置/元素,或者都是Inputiterator end()
迭代器"自然"operator==
特别处理的单数值?
我认为我的意思是:对于"向上"上的任何东西,拥有一个微不足道的operator==
可以是完全有意义。对于输入术语,这是否有意义?
不是 ForwardIterator
的 InputIterator
是将其增量无效的 CC_6(含义具有相同值的任何迭代器,即原始值的任何副本)。
通常,只能从"相同序列"(即一个可以从另一个序列到达)比较迭代器。对于您要谈论的迭代器,这意味着唯一有效的比较是:
- 两个平等的非终端迭代
- 两端迭代器
- 终端迭代器和非末端迭代器
您无法(通过此接口的保证)比较两个不平等的非终端迭代器,因为您永远没有两个有效的非迭代器,其中一个迭代器可从另一个迭代器。"背后"的一个已经无效。
因此,您似乎可以实现迭代器,以便它包含一个具有最终迭代剂值的数据成员,而在非终端迭代器中具有不同的值。对于流迭代器的典型示例,数据成员可以是bool isEndOfStream
。那么operator==
不需要包含任何特殊案例代码,它只需要比较该字段即可。然后,所有最终迭代器都可以互换是很自然的:该领域是唯一可以使用的东西。
这很可能是有效的,因为迭代器变得比迭代剂的结局频率要少得多,因此,在极少数情况下,允许常见案例的写作只是读取和比较似乎是明智的。这样的迭代器比较将对任何两个非终端迭代器返回true,但这很好,因为它们是真正平等的(在这种情况下返回true是正确的),或者比较它们是无效的(在这种情况下,行为不确定)。
规范示例是istream_iterator
(模板),当基础流提取失败时,它会变得单数。可以通过比较相同类型的默认构造的迭代器来检测到这,该迭代器等效于单数迭代器。例如:
std::vector<int> v(std::istream_iterator<int>(std::cin), {});
这是:
等效的std::vector<int> v;
for (int n; std::cin >> n; ) { v.push_back(n); }
再次强调:所有一端的末端迭代迭代器都是等效的,独立于它们的流。这些迭代器是一个示例,其中"单数"(=与任何容器没有关联)和"一式末端"(=递增最后一个不可定述的迭代器的结果)是相同的。
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 给定一个整数,将其表示为平方和
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 在由邻接列表表示的树中查找节点到另一个给定节点之间的路径
- 如何在以 256 为基数的唯一 xLen-digit 表示中写一个整数 x?
- 如何编写一个字节表示为c 中的文件
- 从带有ifstream和get()的文件中获取一个用引号表示的字符串
- 有没有办法构造一个 constexpr 函数来获取双精度的位表示
- 是否有一个术语来表示"single mutex deadlock"(具有非递归互斥锁的死锁类型情况)?
- 如何将一个数字(大于8个字节)从字符阵列转换为其ASCII表示
- 从文本文件读取到表示一个月的二维数组中
- 输入迭代器的示例`end()`实际上表示一个past-end-end
- 模板化类,如何在不使此类模板化的情况下表示为另一个类的成员变量
- C++:是否可以有一个模板类来表示对资源的条件引用
- 将 n 个整数组合成一个唯一的表示形式
- Do C和C++标准意味着地址空间中必须只存在一个特殊值来表示空指针的值
- 表示一个地址需要多少内存
- 我如何表示一个在c++中只存储0或1的数组[100000][100000]
- 最好的数据结构时,表示一个简单的电路- c++
- 我怎么来表示一个函数