迭代器与&的区别是什么?符号和没有它的一个,如下面的设计例子中的情况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;
}
}
是否与创建迭代器对象有关,那么代码块中可用的是什么?我对迭代器很新。
答案 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引用。如果是,那么这是您的编译器提供的一些扩展。
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> >}’