Как я могу обнаружить последнюю итерацию в цикле над std :: map? - PullRequest
27 голосов
/ 30 сентября 2008

Я пытаюсь найти лучший способ определить, нахожусь ли я на последней итерации цикла над картой, чтобы сделать что-то вроде следующего:

for (iter = someMap.begin(); iter != someMap.end(); ++iter) {
    bool last_iteration;
    // do something for all iterations
    if (!last_iteration) {
        // do something for all but the last iteration
    }
}

Кажется, есть несколько способов сделать это: итераторы с произвольным доступом, функция distance и т. Д. Что такое канонический метод?

Редактировать: нет итераторов произвольного доступа для карт!

Ответы [ 14 ]

0 голосов
/ 01 октября 2008

Вот мой оптимизированный дубль:

iter = someMap.begin();

do {
    // Note that curr = iter++ may involve up to three copy operations
    curr = iter;

    // Do stuff with curr

    if (++iter == someMap.end()) {
        // Oh, this was the last iteration
        break;
    }

    // Do more stuff with curr

} while (true);
0 голосов
/ 30 сентября 2008

Полная программа:

#include <iostream>
#include <list>

void process(int ii)
{
   std::cout << " " << ii;
}

int main(void)
{
   std::list<int> ll;

   ll.push_back(1);
   ll.push_back(2);
   ll.push_back(3);
   ll.push_back(4);
   ll.push_back(5);
   ll.push_back(6);

   std::list<int>::iterator iter = ll.begin();
   if (iter != ll.end())
   {
      std::list<int>::iterator lastIter = iter;
      ++ iter;
      while (iter != ll.end())
      {
         process(*lastIter);
         lastIter = iter;
         ++ iter;
      }
      // todo: think if you need to process *lastIter
      std::cout << " | last:";
      process(*lastIter);
   }

   std::cout << std::endl;

   return 0;
}

Эта программа дает:

 1 2 3 4 5 | last: 6
0 голосов
/ 30 сентября 2008

Простой, но эффективный подход:

  size_t items_remaining = someMap.size();

  for (iter = someMap.begin(); iter != someMap.end(); iter++) {
    bool last_iteration = items_remaining-- == 1;
  }
0 голосов
/ 30 сентября 2008

Вы можете просто извлечь элемент из карты перед итерацией, затем выполнить свою «последнюю итерацию» вне цикла и затем поместить элемент обратно в карту. Это ужасно плохо для асинхронного кода, но, учитывая, насколько плохо остальная часть C ++ для параллелизма, я не думаю, что это будет проблемой. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...