2013-11-13 2 views
2

Я пытаюсь создать набор циклов с итераторами, и у меня возникают проблемы с некоторой арифметикой итератора (что я думал, что это возможно, но не работает).C++ список итератор арифметики?

Ниже приведен код:

for (list<Term>::iterator itr = final.begin(); itr != final.end(); itr++) { 
     for(list<Term>::iterator j = itr + 1; j != final.end(); j++) { 
      cout << itr->term << " " << j->term; 
      if(itr->term == j->term) { 
       //Do stuff 
      } 
     } 
    } 

То, что я пытаюсь сделать, это J старт на следующем месте в очереди вдоль от ITR. Причина в том, что я не хочу проверять первый элемент против себя. Сама ошибка возникает из части кода, в которой я указал itr + 1. Теперь я был уверен, что с указателями вы могли бы сделать арифметику следующим образом: почему она не работает с итератором списка (что по сути то же самое?)

Ошибка, которую я получаю из своей IDE, выглядит следующим образом: main.cpp:237:48: error: no match for ‘operator+’ in ‘itr + 1’. Снова я думал, что вы можете сделать такую ​​арифметику на итераторах, чтобы я не был уверен, что делать, чтобы сделать эту работу, есть ли альтернативная реализация, которую я мог бы попробовать?

ответ

5

list имеет двунаправленные итераторы, которые не поддерживают operator +. Вы можете использовать std::advance, или std::next в C++ 11.

for (list<Term>::iterator j = next(itr); j != final.end(); ++j) 

или

list<Term>::iterator j = itr; 
advance(j, 1); // or ++j 
for (; j != final.end(); ++j) 
+1

Зачем вам вызывать' std :: advance' с постоянным аргументом 1, когда во всех случаях это возможно, так же как и '++'? –

+0

Это трюк, спасибо! – Scott

+0

@BenjaminLindley вы правы. ++ j будет лучше. – ForEveR

3

list итераторы не являются случайным доступом, поэтому вы не можете сделать + с ними. Они являются двунаправленными итераторами, поэтому единственными действиями, которые вы можете сделать, являются -- и ++. Вы можете сделать копию и использовать на ней ++ или сделать копию и std::advance(it, 1).

Для C++ 11 есть также std::next, который дает вам it + 1, без необходимости явно создавать именованные копии, как вы делаете с остальными.

+0

Вы предлагаете мне сделать копию внутреннего или внешнего итератора? Я предполагаю, что вы имеете в виду внешний итератор цикла, а затем исправляете его, как только я дойду до конца цикла? – Scott

+0

@Scott вам нужно сделать копию 'itr' и увеличить его отдельно, например' list :: iterator j = itr; ++ j'. Для 'std :: next' вы можете просто сделать' list :: iterator j = std :: next (itr) '(или' auto j = std :: next (itr) 'для C++ 11, который у вас есть, если у вас есть 'next') – uk4321

Смежные вопросы