Как правильно и быстро свернуть multimap
От: ShootNik  
Дата: 06.03.08 09:40
Оценка:
#include <iostream>
#include <string>
#include <map>

void main()
{
    typedef std::multimap< int, int > MM;
    typedef MM::const_iterator mmci;
    MM m;

    m.insert( std::make_pair(1, 1) );
    m.insert( std::make_pair(1, 2) );
    m.insert( std::make_pair(1, 3) );
    m.insert( std::make_pair(2, 4) );
    m.insert( std::make_pair(3, 5) );
    m.insert( std::make_pair(3, 6) );
    m.insert( std::make_pair(4, 7) );
    m.insert( std::make_pair(5, 8) );
    m.insert( std::make_pair(5, 9) );

    for(mmci i = m.begin(); i != m.end();)
    {
        int s = 0, k = i->first;
        for(mmci j = m.lower_bound(k), i = m.upper_bound(k); j != i; ++j)
            s += j->second;

        std::cout << s << "\n";
    }
}


В результате хотелось бы получить
6
4
11
17

но у меня ошибка, идет зацикливание, где то тут ошибка
Re: Как правильно и быстро свернуть multimap
От: Bell Россия  
Дата: 06.03.08 09:49
Оценка:
Здравствуйте, ShootNik, Вы писали:

Во втором цикле итератор i — новая сущность, которая не имеет никакого отношения к i из внешнего цикла.
Правильно так:
int _tmain(int argc, _TCHAR* argv[])
{
    typedef std::multimap< int, int > MM;
    typedef MM::const_iterator mmci;
    MM m;

    m.insert( std::make_pair(1, 1) );
    m.insert( std::make_pair(1, 2) );
    m.insert( std::make_pair(1, 3) );
    m.insert( std::make_pair(2, 4) );
    m.insert( std::make_pair(3, 5) );
    m.insert( std::make_pair(3, 6) );
    m.insert( std::make_pair(4, 7) );
    m.insert( std::make_pair(5, 8) );
    m.insert( std::make_pair(5, 9) );

    for(mmci i = m.begin(); i != m.end();)
    {
        int s = 0, k = i->first;
        i = m.upper_bound(k);
        for(mmci j = m.lower_bound(k); j != i; ++j)
            s += j->second;

        std::cout << s << "\n";
    }

    
    return 0;
}


ЗЫ
Вместо двух вызовов upper_bound и lower_bound можно использовать equal_range.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как правильно и быстро свернуть multimap
От: Bell Россия  
Дата: 06.03.08 10:03
Оценка:
Здравствуйте, Bell, Вы писали:

А вообще все можно сделать за один проход

   mmci i = m.begin(), prev = i;
   int s = i->second;
   for(++i; prev != m.end(); ++i, ++prev)
   {
      if(m.end() == i)
         std::cout << s << "\n";
      else if(prev->first == i->first)
         s += i->second;
      else
      {
         std::cout << s << "\n";
         s = i->second;
      }
   }
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.