c++ - 为什么使用引用作为迭代器
问题描述
我正在学习 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 性能技巧?
解决方案
在这种情况下,auto
和之间的另一个区别是,您可以修改向量中的值。这可能是一个等待发生的不良错误。理想情况下,如果您打算仅参考阅读,您应该使用 const 参考:auto&
auto&
const auto &
当向量包含的对象不仅仅是基本的数字或指针类型时,使用引用的好处是它不会将整个对象复制到临时对象。如果对象具有任何深拷贝语义,或者可能是 shared_ptr,那么可能会完全避免显着的开销。
对于基本类型,复制通常非常快,因此首选单个副本,但是如果被要求引用基本类型然后多次使用该引用,您可以期望编译器优化器会做“正确的事情”,因此对于模板编程当您不知道类型时,您应该优先使用 const-ref 而不是副本以保持代码简单。
推荐阅读
- db2 - Getting NULL Value in Stored Procedure TEXT Column
- typescript - 对象作为 Typescript 中的映射键
- trace32 - Get address of the breakpoint in Lauterbach
- javascript - 上传后如何用javascript显示文件名
- python - How to connect to remote OpenVas scanner with python?
- pyopenssl - Unable to load PEM-encoded private key from Pyjks into PKey object
- django - Using ArrayField and adding 'django_postgres_extensions' to INSTALLED_APPS causes LookupError: No installed app with label 'admin'
- shell - Can't execute sh script with parameters in Ansible
- ada - 使用 LCM 功能时的 CONSTRAINT_ERROR
- asp.net - 如何在 Oracle 数据库中存储敏感数据(例如数据库密码)