MA *_*ing 5 c++ iterator vector c++11
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> vec = {1,2,3,4};
for(auto & it = vec.begin(); it != vec.end(); ++it)
{
cout << *it << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
大家好,在C++中我通过引用使用iterator,例如"auto&it",编译器返回错误
"错误:从类型为'std :: vector :: iterator {aka __gnu_cxx :: __ normal_iterator>}'的右值为'(__gnu_cxx :: __ normal_iterator>&''的非常规引用的无效初始化为(auto&it = vec. begin(); it!= vec.end(); ++ it)".
我知道"auto it = vec.begin()"工作正常但是我们都知道通过引用传递将提高C++的效率,那么为什么当我使用"auto&it"时会出现这个错误?
eer*_*ika 14
那么为什么当我使用"auto&it"时会出现这个错误?
查看返回类型begin.它不会返回引用.它按值返回迭代器.因此,返回值是右值类别中的临时值.Temporaries(rvalues)不能绑定到非const左值引用.这就是错误" 从类型的右值...的类型的非const引用无效初始化... "的意思.
此外,修改begin容器的指针没有多大意义.begin返回引用本来是愚蠢的.
解决方案:只需通过声明非引用值来创建迭代器的副本,就像您知道正常工作一样.
但众所周知,通过引用传递将提高C++的效率
这是无稽之谈.任意放置的参考不太可能提高效率.此外,你不是试图在这里传递参考.您正在尝试绑定对函数返回的对象的引用.
几乎,如果不是总是,迭代器的复制速度非常快(std::vector::iterator当然是这样),并且您可能通过引用引入的间接可能效率较低.
返回std::vector::begin一个右值(临时对象)。auto&您不能使用(非常量左值引用)引用临时对象。如果你想通过引用获取提到的返回值,你可以使用auto&&而不是auto&但我不推荐它。
使用auto&&将创建一个对 的返回值的可变右值引用std::vector::begin。这将延长其使用寿命,但我建议仅使用auto。
使用右值引用不会提高代码的效率,编译器将优化std::vector::begin从值返回的交互器对象的复制/移动。