#c #iterator
#c #итератор
Вопрос:
КОД A:
vector< int >::const_reverse_iterator rcit;
vector< int >::const_reverse_iterator tit=v.rend();
for(rcit = v.rbegin(); rcit != tit; rcit)
cout << *rcit << " ";
КОД B:
vector< int >::const_reverse_iterator rcit;
for(rcit = v.rbegin(); rcit != v.rend(); rcit)
cout << *rcit << " ";
КОД A работает нормально, но
почему КОД B выдает ошибку :
РАЗРАБОТЧИК C vector_test.cpp нет соответствия для ‘operator!=’ в ‘rcit != std::vector<_Tp, _Alloc>::rend() с _Tp = int, _Alloc = std::allocator’.
Это программа, которую я пытался написать.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using namespace std;
#include <vector>
using std::vector;
template< typename T > void printVector( const vector< T > amp;v);
template< typename T >
void printVector( const vector< T > amp;v)
{
typename vector< T >::const_iterator cit;
for(cit = v.begin(); cit != v.end(); cit)
cout << *cit << " ";
}
int main()
{
int number;
vector< int > v;
cout << "Initial size of the vector : " << v.size()
<< " and capacity : " << v.capacity() << endl;
for(int i=0; i < 3; i )
{
cout << "Enter number : ";
cin >> number;
v.push_back(number);
}
cout << "Now size of the vector : " << v.size()
<< "and capacity : " << v.capacity() << endl;
cout << "output vector using iterator notation " << endl;
printVector(v);
cout << "Reverse of output ";
vector< int >::const_reverse_iterator rcit;
for(rcit = v.rbegin(); v.rend() != rcit ; rcit)
cout << *rcit << " ";
cin.ignore(numeric_limits< streamsize >::max(), 'n');
cin.get();
return 0;
}
Комментарии:
1. Опубликуйте еще немного кода… опубликованный вами код не является проблемой…
2. ваш код отлично компилируется для меня с mingw в Windows
3. хм, спасибо, @Vusak, это может быть мой компилятор DevC … хм
4. @munish Да, я только что наткнулся на ту же ошибку, используя DevC . Благодаря вашему вопросу здесь, я нашел обходной путь в кратчайшие сроки!
5. Это воспроизводимо с компилятором Android NDK версии 9 (и, возможно, более ранних версий)
Ответ №1:
Проблема в том, что существует две формы rend
метода:
reverse_iterator rend();
const_reverse_iterator rend() const;
При выполнении сравнения кажется, что используется первый (хотя я не знаю почему), и оператор !=
для сравнения ‘const’ и ‘non-const’ итератора не определен. Однако при присвоении переменной компилятор может определить правильную функцию для вызова, и все это работает правильно.
Комментарии:
1. P.S. Ваша программа отлично работает для моей компиляции с gcc в Linux.
2. Спасибо, sje397 это еще раз подтверждает, что ошибка может быть связана с моим компилятором DevC 4.9.9.2. Я не очень разбираюсь в компиляторах, я получил его онлайн и начал использовать. Я не знаю, какой компилятор подходит для изучения и практики C . Можете ли вы предложить некоторые.
3. Я бы посоветовал компилятор Visual Studio для Windows (есть бесплатная версия ‘express’) и gcc в других местах — я почти ничего больше не трогал.
4. @sj397, ваше объяснение выше кажется нормальным, я думаю, потому что, если я просто использую неконстантную версию итератора, он компилируется нормально, проблема возникает только при использовании const_reverse_iterator .
Ответ №2:
Я не получаю никаких ошибок или предупреждений при компиляции следующего в Xcode 4 или codepad:
#include <iostream>
#include <vector>
int main () {
using namespace std;
vector< int > v;
vector< int >::const_reverse_iterator rcit;
for(rcit = v.rbegin(); rcit != v.rend(); rcit)
cout << *rcit << " ";
}
Отличается ли ваша программа от этого каким-либо существенным образом? Какой компилятор вы используете? Работает ли предложение огняна? А что, если заменить !=
на ==
? (Я знаю, что это вызвало бы ошибку во время выполнения, но мне любопытно, как на это отреагирует компилятор.)
Комментарии:
1. Примечание: Ваш полный список программ также отлично компилируется.
2. Нет, предложение @ognian не сработало. и я просто скопировал ваш код, вставил и запустил. выдает ту же ошибку, возможно, это моя версия компилятора DevC 4.9.9.2.Я не пробовал == хотя.@ Вусак также скомпилировал мой код, и все было в порядке
3. Спасибо, да, это работает так, как это делали почти все выше и ниже. Это компилятор . Мне нужно протестировать это в другом месте
4. Похоже, что DevC использует MinGW. Я удивлен, что вы столкнулись с этой проблемой. В качестве альтернативы, быстрый и беспроблемный способ поиграть с C — это онлайн-среда, такая как codepad . А в Windows Visual Studio Express 2010 — это IDE, которую я бы настоятельно рекомендовал.
Ответ №3:
Попробуйте поменять местами операнды != следующим образом:
for(rcit = v.rbegin(); v.rend() != rcit; rcit)
Комментарии:
1. @Nawaz: в некоторых дерьмовых реализациях STL это делает