提问者:小点点

通过引用使用vector<int>::迭代器,但有错误


#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;
    }
}

大家好,在 C 中,我通过引用使用迭代器,例如“auto

“错误:'__gnu_cxx::__normal_iterator类型的非常量引用的初始化无效

我知道“auto it = vec.begin()”工作正常,但是我们都知道通过引用传递将提高C语言的效率,那么为什么当我使用“auto


共3个答案

匿名用户

那么为什么当我使用“自动”时会出现这个错误呢?

请参阅开始的返回类型。它不返回引用。它按值返回迭代器。因此,返回值是右值类别中的临时值。临时值(右值)不能绑定到非常量左值引用。这就是错误“无效初始化类型的非常量引用...从类型的右值...”方法。

此外,修改容器的开始指针没有什么意义。开始返回引用是愚蠢的。

解决方案:通过声明一个非引用值来创建一个迭代器的副本,就像你知道的那样。

但是众所周知,通过引用传递会提高C语言的效率

这是无稽之谈。任意放置的参考不太可能提高效率。此外,您不会尝试在此处传递引用。您正在尝试将引用绑定到函数返回的对象。

几乎(如果不是总是这样的话),迭代器的复制速度非常快(std::vector::迭代器当然是这样),并且您可能使用引用引入的间接寻址可能效率会降低。

匿名用户

std::vector::begin返回一个右值(一个临时对象)。不能使用auto获取对临时对象的引用

使用<代码>自动

使用右值引用不会提高代码的效率,编译器将通过值优化从std::向量::begin返回的交互器对象的复制/移动。

匿名用户

auto 关键字从表达式 (std::vector::begin) 中获取类型作为临时对象,因为它是临时对象,因此编译器无法推断出对它的引用。自动

在您的情况下,最好的方法是使用没有参考的自动变量而不是自动

如果你被迫使用引用C 11引入了rvalue-reference,它可以绑定到临时对象更改为

 vector<int> vec = {1,2,3,4};
    for(auto && it = vec.begin(); it != vec.end(); ++it)
    {
        cout << *it << endl;
    }