1
54
这样做:
仅此而已。永远不要给你未定义的行为,在所有迭代器上工作,好的一天。 为了好玩,把它包起来:
给:
如果您对实用功能/好看的代码过敏,请执行以下操作:
但不能在非随机访问迭代器上进行。这一个用于双向迭代器:
从那以后就安全了
|
2
11
是的,递减(或递增)是不安全的。
要真正安全,请使用已知安全有效的减法和值:
与所有前向迭代器兼容(例如
或者,如果你关心性能,但有双向迭代器(包括任何C++ 03容器)
或者只对前向迭代器和O(1)次进行分析,
或者,如果您非常聪明,避免命名迭代器类,
|
3
5
为什么只有当项目是最后一个项目时才需要执行特殊行为?
这个怎么样?该计划只是比较迭代器项的地址与容器中最后一个项的地址,并检查以确保该项实际上还没有结束(使
|
4
3
如果你这样做:
应该没事。因为如果itr不在末尾,那么容器中必须至少有一个元素,因此当递减时,end必须产生一个值结果。 但是如果你仍然不喜欢,有很多方法可以做同样的事情,就像所有其他答案所显示的那样。 另一种选择是:
|
5
3
你首先需要一种方法 determine if an iterator is a reverse one ,那是 ingeniously shown here :
然后您可以有两种口味来执行测试
以及单个接口函数
然后对于每种类型的迭代器(反向/直线),都可以使用接口函数
注意一些实现(除了
|
6
2
这是另一个潜在的解决方案:
|
7
1
这基本上与从单个链接列表中删除节点相同。您必须有两个迭代器,一个在一个节点之后,另一个在另一个节点之后,所以当“前进”迭代器到达要删除的节点(或任何操作;在您的情况下,所需的节点将是结尾)时,“跟随”迭代器指向之前的节点(在您的情况下,这将是最后一个节点)。 |
8
1
一个更好的方法是复制迭代器,然后递增它。然后,您可以使用
如果ITR可能已经结束:
或者,根据GMAN的答案,但更安全一点:
我又修了最后一个,因为我错了
|
9
1
尽量使这个答案简单和通用:
如果迭代器不是双向的,
第二个创建一个ITR的临时副本,并对其进行增量,以针对结束迭代器进行测试。 在这两种情况下,第一个测试都避免使用空容器来触发未定义的情况。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |