首页 > 解决方案 > 为什么使用引用作为迭代器

问题描述

我正在学习 std::vector 的 emplace() 并偶然发现了这段代码:

// vector::emplace
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30};

  auto it = myvector.emplace ( myvector.begin()+1, 100 );
  myvector.emplace ( it, 200 );
  myvector.emplace ( myvector.end(), 300 );

  std::cout << "myvector contains:";
  for (auto& x: myvector)
    std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

我想知道为什么在 for 循环中他们使用引用 auto& x 而不是简单的副本,我尝试不使用 & 并且它的工作方式相同,这是避免复制的安全性还是 aa 性能技巧?

标签: c++loopsfor-loopreferencec++14

解决方案


在这种情况下,auto和之间的另一个区别是,您可以修改向量中的值。这可能是一个等待发生的不良错误。理想情况下,如果您打算仅参考阅读,您应该使用 const 参考:auto&auto&const auto &

当向量包含的对象不仅仅是基本的数字或指针类型时,使用引用的好处是它不会将整个对象复制到临时对象。如果对象具有任何深拷贝语义,或者可能是 shared_ptr,那么可能会完全避免显着的开销。

对于基本类型,复制通常非常快,因此首选单个副本,但是如果被要求引用基本类型然后多次使用该引用,您可以期望编译器优化器会做“正确的事情”,因此对于模板编程当您不知道类型时,您应该优先使用 const-ref 而不是副本以保持代码简单。


推荐阅读