Как может я обнаруживать последнее повторение в цикле по станд.:: карта?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

27
задан Lightness Races with Monica 8 December 2011 в 12:58
поделиться

10 ответов

Канонический? Я не могу утверждать, что, но предложил бы

final_iter = someMap.end();
--final_iter;
if (iter != final_iter) ...

Отредактированный исправить, как предложено KTC. (Спасибо! Иногда Вы идете слишком быстрые и портите на самых простых вещах...)

25
ответ дан Community 28 November 2019 в 04:24
поделиться

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

-2
ответ дан Daniel Spiewak 28 November 2019 в 04:24
поделиться

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

#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
-1
ответ дан florin 28 November 2019 в 04:24
поделиться

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

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);
-1
ответ дан Ates Goral 28 November 2019 в 04:24
поделиться

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

  size_t items_remaining = someMap.size();

  for (iter = someMap.begin(); iter != someMap.end(); iter++) {
    bool last_iteration = items_remaining-- == 1;
  }
0
ответ дан Jason Etheridge 28 November 2019 в 04:24
поделиться
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>

using namespace boost::lambda;

// call the function foo on each element but the last...
if( !someMap.empty() )
{
  std::for_each( someMap.begin(), --someMap.end(), bind( &Foo, _1 ) );
}

Использование std :: for_each обеспечит плотный и точный цикл ... Обратите внимание на введение функции foo (), которая принимает один аргумент (тип должен соответствовать тому, что содержится в someMap). В этом подходе добавлена ​​1 строка. Конечно, если Foo действительно маленький, вы можете использовать лямбда-функцию и избавиться от вызова & amp; Foo.

1
ответ дан paxos1977 28 November 2019 в 04:24
поделиться

Удивило, что никто еще не упомянул об этом, но, конечно, у boost есть кое-что;)

Boost.Next (и эквивалентный Boost.Prior)

Ваш пример будет выглядеть как:

for (iter = someMap.begin(); iter != someMap.end(); ++iter) {
    // do something for all iterations
    if (boost::next(iter) != someMap.end()) {
        // do something for all but the last iteration
    }
}
5
ответ дан Pieter 28 November 2019 в 04:24
поделиться

Измененный Mark Ransom, таким образом, это на самом деле работает, как предназначено.

finalIter = someMap.end();
--finalIter;
if (iter != final_iter)
6
ответ дан KTC 28 November 2019 в 04:24
поделиться

Если вы просто хотите использовать ForwardIterator, это должно сработать:

for ( i = c.begin(); i != c.end(); ) {
        iterator cur = i++;
        // do something, using cur
        if ( i != c.end() ) {
                // do something using cur for all but the last iteration
        }
}
9
ответ дан camh 28 November 2019 в 04:24
поделиться

Это походит на самое простое:

bool last_iteration = iter == (--someMap.end());
14
ответ дан Torlack 28 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: