使用迭代器在vector c ++中循环

时间:2013-11-13 18:38:43

标签: c++ vector

我有这段代码:

std::vector<A>::iterator it;
for(auto it = m_vA.begin(); it != m_vA.end(); it++)

我犯了一个错误:

ISO C++ forbids declaration of 'it' with no type
cannot convert '__gnu_cxx::__normal_iterator<A* const*, std::vector<tp::Vehicule*, std::allocator<A*> > >' to 'int' in initialization

如果我删除了自动

erreur: no match for 'operator=' in 'it = ((const B*)this)->B::m_vA.std::vector<_Tp, _Alloc>::begin [with _Tp = A*, _Alloc = std::allocator<A*>]()'

B是我的循环类

由于

4 个答案:

答案 0 :(得分:2)

对于auto,您似乎没有启用c ++ 11,如果启用它,则应删除此行:

std::vector<A>::iterator it;

如果您在删除auto后无法使用c ++ 11和错误,看起来就像将此代码放入const方法一样,所以用const_iterator替换迭代器:

std::vector<A>::const_iterator it;
for(it = m_vA.begin(); it != m_vA.end(); it++)

如果在循环之后不需要这个迭代器,你也可以使它成为一行:

for(std::vector<A>::const_iterator it = m_vA.begin(); it != m_vA.end(); it++)

答案 1 :(得分:1)

从我看到的情况来看,您使用const方法,应使用const_iterator,或删除const

如果您之前声明了变量,则不需要auto。它不会产生错误,只是一个警告,但你必须选择一种方式;)

答案 2 :(得分:1)

解决您的问题删除 auto关键字。

您必须启用C ++ 11才能使用auto。如果您使用的是gcc编译器,则可以通过-std=c++11-std=c++0x编译器的开关来启用它。

目前它正在使用旧版C编译器继承的auto关键字,这些关键字将被省略。编译器认为你再次声明it但没有类型。

答案 3 :(得分:1)

如果您确实启用了C ++ 11,那么为什么要像这样使用auto?只需使用基于范围的for循环:

for (auto i : m_vA)
    // do stuff here with i

此外,您的代码的问题是您指定了it的类型,因此在for循环中使用auto毫无意义。同样,如果你正在使用C ++ 11,你应该使用上面的循环,因为它更容易编写和理解。