迭代器与引用符号之间有什么区别,有没有。 (C ++循环)

时间:2014-11-04 14:09:23

标签: c++ iterator auto

迭代器与&的区别是什么?符号和没有它的一个,如下面的设计例子中的情况1和2所示?

我应该何时使用其中一种?

#include <iostream>
#include <vector>
int main() {
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);

    // case 1:
    for (auto & i = v.begin(); i != v.end(); ++i) {
        std::cout << *i << std::endl;
    }

    // case 2:
    for (auto i = v.begin(); i != v.end(); ++i) {
        std::cout << *i << std::endl;
    }
}

是否与创建迭代器对象有关,那么代码块中可用的是什么?我对迭代器很新。

3 个答案:

答案 0 :(得分:4)

不同之处在于第一个循环不会被编译。:)

for (auto & i = v.begin(); i != v.end(); ++i) {
    std::cout << *i << std::endl;
}

您创建了一个由成员函数begin返回的临时对象,并使用非const引用绑定它。

答案 1 :(得分:2)

这不是特定于迭代器,而是auto关键字如何工作。

此语法

auto const &i = (something)

将创建对赋值右侧对象的引用;在这种情况下,对临时对象的const引用,相当于

std::vector<int>::iterator const &i = (something)

请注意,在这种情况下,auto &i = v.begin()无效,因为std::vector::begin()实际上并未返回引用。

另一方面,没有引用的语法

auto i = (something)

将创建对象的实例,这相当于

std::vector<int>::iterator i = (something)

实际上,这两个语句是等价的,因为引用实际上是引用对象的生命周期扩展。如果函数begin()返回了引用,则无引用语法将创建副本。

答案 2 :(得分:-1)

你应该使用第二个而不是第一个,因为第一个不编译。 begin按值返回临时对象,不允许将临时对象绑定到非const引用。如果是,那么这是您的编译器提供的一些扩展。

http://ideone.com/oBvFOu3

error: invalid initialization of non-const reference of type ‘__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> >}’