1
10
有许多使用迭代器的操作会导致未定义的行为,此触发器的目标是激活运行时检查以防止其发生(使用断言)。 问题 显而易见的操作是使用一个无效的迭代器,但是这种无效性可能是由各种原因引起的:
对于每个操作使哪个迭代器失效的容器,其详细信息的标准精确性。 人们往往会忘记一个不太明显的原因:将迭代器混合到不同的容器中:
这涉及到一个更普遍的问题:传递给算法的范围的有效性。
解决方案 解决方案包括向迭代器添加信息,以便在执行期间断言迭代器的有效性和它们定义的范围的有效性,从而防止发生未定义的行为。
这个
在Dinkumware中,这是通过两个附加项实现的:
这很好地解决了我们的问题:
成本 成本很高,但是正确性有代价吗?但我们可以分解成本:
当然,大多数库算法都是为了最大限度地提高效率而实现的,通常在算法开始时一次性完成检查,然后运行未检查的版本。然而,速度可能会严重减慢,尤其是手写循环:
我们知道
乌普斯
行的味道不好,但这里更糟:在循环的每次运行中,我们都创建一个新的迭代器,然后销毁它,这意味着为
当然,A
|
2
0
据我所知: _ has-iterator调试将在运行时显示一个对话框,以断言任何不正确的迭代器使用,包括: 1)元素被擦除后在容器中使用的迭代器 2)调用.push()或.insert()函数后向量中使用的迭代器 |
3
0
根据 http://msdn.microsoft.com/en-us/library/aa985982%28v=VS.80%29.aspx
|
Julia · 矢量中相加为总和S的值的数量 1 年前 |
C_Rod · 在模板方法中确定STL容器中项目的数据类型 2 年前 |
quantumwell · 将空向量放入std::map() 6 年前 |
OutOfBound · 对未初始化内存使用算法的优点 6 年前 |
DarthRubik · 在使用列表删除之后,迭代器如何不无效 6 年前 |