C ++迭代器是“安全的”吗?

时间:2011-01-26 21:17:52

标签: c++ stl iterator

我已经阅读了C ++列表迭代器的文档,但无法弄清楚一件事:C ++迭代器是否“安全”?我的意思是,一旦到达列表中的最后一个现有元素,它是否会停止递增?

[]的

7 个答案:

答案 0 :(得分:11)

不,从这个意义上讲,它们并不“安全”。可以将迭代器递增到结尾。对于标准库中的所有迭代器,执行此操作将导致未定义的行为。您可以定义自己的迭代器,如果您愿意,可以安全地运行。

答案 1 :(得分:9)

你要问的是 std::list::iterator做绑定检查。答案是否定的,但事实并非如此。这意味着迭代器比其他方式更快。如果你想要绑定检查,那么你可以用你自己的绑定检查迭代器包装器包装迭代器。

但是如果在使用迭代器时遵循约定,那么当迭代器无效时,您将始终知道在编译时,即指向无效位置。例如:

  • 当您从std::list中删除元素时,请确保存储迭代器erase()返回以获取指向新有效位置的有效迭代器,就在擦除元素之外。
  • 当您致电std::remove()时,请确保存储已返回的迭代器,以便了解容器的新边界。

这种方法将边界检查问题转移到一边,同时保留了迭代器的性能,这些迭代器不需要费心去确保用户不会在脚下射击。

答案 2 :(得分:3)

必须测试是否it != list.end(),如果已达到结束则离开循环。

答案 3 :(得分:2)

没有。如果取消引用“过去的”迭代器,则会得到未定义的行为。

答案 4 :(得分:0)

没有。像C ++中的许多东西一样,默认值是速度。

理由是你可以在以后交换速度以保证安全,但反之亦然。

答案 5 :(得分:0)

要回答你的问题,"否"它们不会停止,因为责任在于所有者检查界限。

但是,可以将检查放入代理迭代器并强制执行边界检查。这将花费你,因为最有可能会付出代价。大多数std算法现在都有输入和输出迭代器的第一个/最后一个(参见std :: copy(first_in,last_in,first_out,last_out),并将检查边界以及不接受输出结束的边界并不总是有效的操作(例如直到流的结束才知道 它发生了)

您可以编写包含迭代器副本,第一个位置和最后一个位置的迭代器代理。然后检查它是否会超出operator ++,operator--,以及访问成员或解除引用时的界限。这几乎与编写骨架contianer的工作相同,可以这样使用。有关小示例,请参阅Iterator Proxy Example,然后使用Iterator Proxy Usage Example

答案 6 :(得分:-1)

正确使用迭代器非常有用 因此,“C + +迭代器安全”的问题将取决于它的使用方式 请注意,错误使用printf API可能会导致严重错误。 实施是否可以安全使用。