список итератор + оператор - PullRequest
7 голосов
/ 03 ноября 2010
// ((++currentEntry)--) is equivalent to (currentEntry + 1). Kind of.
menuEntries.insert((++currentEntry)--, newEntries.begin(), newEntries.end());

Итак, у меня есть худший кусок кода в мире.Есть ли лучший способ сделать это?

При использовании '+ 1' я получаю это:

source/menu.cpp:146:37: error: invalid operands to binary expression
      ('list<menuEntry *>::iterator' (aka '_List_iterator<menuEntry *>') and
      'int')
                            menuEntries.insert(currentEntry + 1, ...
                                               ~~~~~~~~~~~~ ^ ~

Ответы [ 5 ]

8 голосов
/ 03 ноября 2010

Почему бы не разбить на несколько строк:

iterator nextEntry = currentEntry;
menuEntries.insert( ++nextEntry, newEntries.begin(), newEntries.end());

, где iterator - тип итератора для спискаЛично я бы, вероятно, потянул ++nextEntry на свою собственную линию для большей ясности - но это, вероятно, субъективное решение.

4 голосов
/ 03 ноября 2010

Как насчет вспомогательной функции:

template<class IterT>
IterT Next(IterT i)
{
  return ++i;
}

Затем можно заменить (++currentEntry)-- на Next(currentEntry)

Редактировать: Или даже лучше: если вы используетеПовысьте см. Предложение Роба о далее и выше в библиотеке утилит

0 голосов
/ 03 ноября 2010

Так как вы не хотите влиять на ваш итератор currentEntry и хотите вставить элемент после currentEntry, currentEntry + 1 - лучшая ставка.

0 голосов
/ 03 ноября 2010

Можно использовать обратные итераторы, например:

myList.insert(myList.rbegin(), newEntries.begin(), newEntries.end())

добавит новые элементы в конец.

Конечно, работает ли это для вас, зависит от того, как вы используетеваш итератор.

0 голосов
/ 03 ноября 2010
++currentEntry;
menuEntries.insert(currentEntry, newEntries.begin(), newEntries.end());
--currentEntry;

или

menuEntries.insert(++currentEntry, newEntries.begin(), newEntries.end());
--currentEntry;
...