当我使用int it = v.begin()
:时,它给了我这个错误
prog.cpp: In function ‘int findFrequency(std::vector<int>, int)’:
prog.cpp:18:32: error: cannot convert ‘std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}’ to ‘int’ in initialization
for(int iterator = v.begin();iterator!=v.end();iterator+
但它在auto it = v.begin()
上运行良好,为什么?
int it = v.begin()
是错误的,因为v.begin()
返回的类型是std::vector<int>::iterator
而不是int
而
auto it = v.begin()
推导迭代器的类型
这是因为迭代器不是整数。迭代器是一个指针,它像向量一样指向列表中的元素。整数只是一个整数,1,2,3,4…
不能将迭代器分配给整数,因为它们不相同。这里有一个链接,可以进一步了解迭代器
auto
将简单地推导类型本身,这样它就可以计算出.begin()
返回一个迭代器。
需要记住两点:
v.begin()
是一个迭代器,指向向量v
中的第一个元素。这个迭代器是一个整数类型的向量容器,它的形式是std::vector<int>::iterator
,而不是int
auto
关键字自动接受其初始值设定项中的数据类型,并将其指定为使用它声明的变量的数据类型。
可能的修正/替代方案?
- 如果您希望将迭代器提取到向量中的第一个元素,那么请坚持使用auto或定义迭代器:
std::vector<int>::iterator it = v.begin();
- 如果您希望提取第一个元素,那么用它的数据类型声明它,它将是
int
类型向量的int
:(正如您可能想到的,也正如smac89所指出的(
int it = v.front();
或者你可以再次使用自动:
auto it = v.front();
在这种情况下,auto推导出的it
的数据类型将是int
,因为这是v.front()
的类型。