2015-02-01 2 views
3

При компиляции нижеприведенной функции следующая ошибка компиляции. почему yt != endIx во втором для цикла незаконно.cpp vector для ошибки условия завершения цикла

ошибка C2678: бинарный '! =': Ни один оператор не найден, который принимает левого операнда типа 'станд :: _ Vector_iterator >>' (или нет приемлемой конверсии)

void printDebug(vector <int> ar) 
{ 
    for (auto it = ar.begin(); it != ar.end(); it++) 
    { 
     auto endIx = ar.end() - it; 
     for (auto yt = ar.begin(); yt != endIx ; yt++) 
     { 
      cout << *it << " : " << endIx ; 
     } 
     cout << endl; 
    } 
} 

Просто, чтобы избежать путаницы, я переименовал авто итератор конца в endIx;

ответ

9

Тип является std::vector<int>::difference_typecontainer trait давая тип расстояния между итераторы), это не итератора.

Использование итератора арифметика с ar.begin() + end в цикле вместо:

void printDebug(vector <int> ar) 
{ 
    for (auto it = ar.begin(); it != ar.end(); it++) 
    { 
     auto end = ar.end() - it; // end is of type vector <int>::difference_type 
     for (auto yt = ar.begin(); yt != ar.begin() + end; yt++) 
     { 
      cout << *it << " : " << end; 
     } 
     cout << endl; 
    } 
} 

Примечание:

Вы должны передать свой вектор по константной ссылке, а не по значению:

void printDebug(const vector<int>& ar) 
{ 
    for (auto it = ar.begin(); it != ar.end(); it++) 
    { 
     auto end = ar.end() - it; // end is of type vector <int>::difference_type 
     for (auto yt = ar.begin(); yt != ar.begin() + end; yt++) 
     { 
      cout << *it << " : " << end; 
     } 
     cout << endl; 
    } 
} 
+1

Примечания («pass by const reference», и «пройти через пару итераторов») не связаны с проблемой, а ИМО отвлекает – anatolyg

+0

@anatolyg удален – quantdev

+1

Мех, пара итераторов может быть скорее вопросом стиля, но я определенно должен отметить, что вектор должен быть передан по const ref, а не по значению. –