STL中的iterator形参为什么不是传引用而是传值

在STL中,我们能见到很多函数的形参都是iterator的传值,而不是传引用。
你会不会问,为什么不是传引用,传引用不是效率更高吗?

  • 这是因为我们通常这么用:
    • void print_vector(vector<int>::iterator beg, vector<int>::itertor end);
      • while(beg != end) { cout << *beg++ << endl; }
    • print_vector(v.begin(), v.end());
    • 这里形参如果是引用的话,则编译时会报错,因为v.begin()返回的是一个临时变量,是一个右值,它不能赋值给一个非const的引用: 
      • error: invalid initialization of non-const reference of type 'std::vector<int>::iterator& {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >&}' from an rvalue of type 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}'
    • 但可以赋值给const 引用;即如果print_vector的形参是const的iterator,就可以传v.begin()给它。但这样一来,在函数体内就不能做++,--或任何修改该iterator的操作了。
  • 这就是iterator一般用传值的原因。
  • 类似的道理,函数的返回值通常不能传给一个非const的引用,因为函数返回值通常也是一个临时变量,是一个右值。
    • int f() { return 1; }
    • int &ri1 = f();            //error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
    • const int &ri2 = f();   // OK
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值