返回的迭代器

Returning Iterators

本文关键字:迭代器 返回      更新时间:2023-10-16

使用map.find((或任何返回迭代器的功能。将返回的值存储为参考是否有任何好处?

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

const auto&如果您在范围内使用 for循环,您也可以确定寿命:

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

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

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

否则,微型临时(如果有的话(不值得它带来的潜在错误。也许有一天,另一个程序员删除了const,然后您有一个临时的引用。

有两个瞬间使此方法无用:

  1. 迭代器设计为轻巧的物体,可廉价地通过价值通过和存储。

  2. 即使在这种情况下您会有重对象,也不会保存任何东西。这就是原因。

想象此代码:

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

在C 的幼年中,第二种情况可能会更加最佳,因为第一个情况可能会在第一个情况下进行复制CTOR。由于RVO(返回值优化(,因此不再是这种情况,这是C 17以来的强制性。因此,与迭代器相比,您的代码曾经对更复杂的对象有意义。如果迭代器,即使不启用了优化,您也不会看到性能的任何差异,即使不要求RVO。因此,某些人认为这样的代码可以认为是不错的,但是我发现它不可读,因为迭代器通常按价值传递,至少会提出一个问题,为什么作者这样做?