返回迭代器

时间:2019-07-31 20:01:11

标签: c++ iterator auto

使用map.find()或任何返回迭代器的函数。 将返回值存储为ref有什么好处?

const auto  it  = map.find(0);
const auto& it2 = map.find(0);

2 个答案:

答案 0 :(得分:1)

如果在范围const auto&循环中使用它,

for可能会有所帮助,在该循环中您还可以确定寿命:

for(const auto& it : map)
{....}

正如@ {Ted所指出的,这种for循环形式

for(const auto& [key, value] : the_map) 
 { ... }

否则,微优化(如果有的话)不值得它带来潜在的错误。 也许有一天,另一个程序员会删除const,那么您就有了对临时目录的引用。

答案 1 :(得分:1)

有2个时刻使此方法无用:

  1. 迭代器设计为轻量级对象,可以廉价地按值传递和存储。

  2. 即使您在这种情况下有重物也不会保存任何东西。这就是为什么。

想象一下这段代码:

HeavyObject foobar();

auto obj1 = foobar();
const auto &obj2 = foobar();

在C ++的早期阶段,由于可能在第一个案例中调用copy ctor,因此第二种案例将更为理想。由于RVO(返回值优化)已经不再是这种情况了,自C ++ 17起,RVO是必需的。因此,与迭代器相比,您的代码以前对更复杂的对象有意义。在使用迭代器的情况下,即使不启用优化,甚至在未强制使用RVO的情况下,您也几乎看不到任何性能差异。因此,这样的代码可能被某些人认为不错,但是我发现它不可读,因为迭代器通常按值传递,并且至少会引发一个问题,为什么作者要这样做?