отображение итератора для вектора - PullRequest
1 голос
/ 10 марта 2012

Я работаю над проектом, в котором я помещаю перечисление в вектор. и мне было интересно, как я мог получить такую ​​функциональность из вектора.

for(int ii = 0; ii < thing.getSize(); ii++){
    cout << "thing(" << ii << ") = " << toString(thing[ii]) << endl;
}

Я пробовал около 5 различных способов сделать это, и ни один из них, похоже, не работает. Я прочитал MSDN vector (vector :: end () казался наиболее полезным, пока не сказал, что оператор << не примет ii как итератор. </p>

кто-нибудь может мне помочь? самый близкий, я думаю, я получил

vector<int>::iterator ii;
for(ii = things.begin(); ii != things.end(); ii++){                       //764
    cout << "thing(" << (int)ii << "): " << toString(things[ii]) << endl; //765
}

но это выдает ошибки, которые либо не имеют смысла, либо я не могу понять, как их решить.

1>c:\...\Project.cpp(764): error C2678: binary '!=' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion)
1>c:\...\Project.cpp(765): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion)
1>c:\...\Project.cpp(765): error C2679: binary '[' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion)

Ответы [ 4 ]

4 голосов
/ 10 марта 2012

Правильный общий способ сделать это -

for(std::vector<int>::const_iterator ii=things.begin(); 
         ii != things.end(); ++ii)
{            
    std::cout << "thing(" 
              << std::distance(things.begin(), ii) 
              << "): " << *ii << std::endl;
}

- разыменовать итератор и использовать std :: distance для получения расстояния от начала.считается плохим для импорта всего пространства имен, лучше иметь явное использование операторов или предпочтительно префиксные типы с его пространством имен.

Как правило, предпочтительнее использовать префиксный оператор увеличения для итераторов.* Кроме того, если вы не делаете интересное форматирование, нет необходимости применять toString к int.Так как для него определен оператор потока.

2 голосов
/ 10 марта 2012

Итераторы ведут себя почти так же, как указатели: они указывают позицию значения, и вам нужно разыменовать их, чтобы получить значение:

std::cout << *ii;
2 голосов
/ 10 марта 2012

Попробуйте:

cout << "thing(" << (ii - things.begin()) << "): " << toString(*ii) << endl; 
1 голос
/ 10 марта 2012

things должен быть объявлен как:

vector < int > things;

Вы можете ввести свои значения в вектор следующим образом:

things.push_back( 1 );
things.push_back( 2 );

Затем вы повторяете так:

for ( vector < int >::iterator i = things.begin(); i != things.end(); ++i )
{
    cout << "things( " << ( i - things.begin() ) << " ): " << toString( *i ) << endl; 
}
...