返回对迭代器的引用是一种好习惯吗? (它甚至有意义)?

时间:2011-09-15 18:23:58

标签: c++ visual-c++ stl objective-c++

我不确定这是否合法 - 通过引用返回迭代器:

  1. 矢量:迭代&安培; getElement(const char * name){...}
  2. 请注意,我的矢量包含元素本身不是指针

    在当前状态下,我按值(不带&)离开了它。

    是否有关于迭代器的共识,还是我可以同时使用这两种方式?

2 个答案:

答案 0 :(得分:3)

有什么意义?迭代器本身就是对向量内部内容的一种引用。您是否希望为某人提供可能在内部修改的迭代器?也就是说,分配给迭代器的引用本身会增加它 - 将它指向向量中的另一个东西 - 并且客户端以某种方式使其迭代器指向正确的东西导致它之前调用了getElement()?这是我能想到的唯一一个对迭代器的引用应用程序,它确实闻起来很糟糕。

但更重要的是,暴露存在严重问题,因此可能会持续存在迭代器。迭代器变得无效。如果你的接口内部有一个迭代器,并且有一些东西删除或添加到向量,你将无法保证客户端的迭代器仍然有效。然后客户端访问它们的无效迭代器和未定义的行为 - 即CRASH - 发生。

答案 1 :(得分:1)

如果迭代器由另一个对象“拥有”并且您希望调用者修改所有者的迭代器,则仅通过引用返回参数是有意义的。其中99%的时间都是个坏主意。通常,迭代器应该被视为一个指针,除了奇怪的情况外,指针几乎总是按值返回/传递。