#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
но у меня ошибка, идет зацикливание, где то тут ошибка
Здравствуйте, 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.
Здравствуйте, 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;
}
}