Подтвердить что ты не робот

Используя BOOST_FOREACH с std:: map

Я хотел бы перебирать std:: map с помощью BOOST_FOREACH и редактировать значения. Я не могу это понять.

typedef std::pair<int, int> IdSizePair_t;
std::map<int,int> mmap;    
mmap[1] = 1;
mmap[2] = 2;
mmap[3] = 3;
BOOST_FOREACH( IdSizePair_t i, mmap )
    i.second++;
// mmap should contain {2,3,4} here

Конечно, это ничего не меняет, потому что я не повторяю ссылки. Поэтому я вместо этого заменю эту строку (в соответствии с примером в документах Boost):

BOOST_FOREACH( IdSizePair_t &i, mmap )

и я получаю ошибку компилятора:

error C2440: 'initializing' : 
cannot convert from 'std::pair<_Ty1,_Ty2>' to 'IdSizePair_t &'
    with
    [
        _Ty1=const int,
        _Ty2=int
    ]

Любые предложения?

4b9b3361

Ответ 1

Проблема заключается в первом члене пары, который должен быть const. Попробуйте следующее:

typedef std::map<int, int> map_t;
map_t mmap;  
BOOST_FOREACH( map_t::value_type &i, mmap )
    i.second++;

Ответ 2

Это старый поток, но есть более удобное решение.

boost имеет понятие "адаптеры диапазона", которые выполняют преобразование на диапазонах итераторов. Существуют специальные адаптеры диапазона для этого точного варианта использования (итерация над картами или значениями): boost::adaptors::map_values и boost::adaptors::map_keys.

Итак, вы можете перебирать значения таких карт следующим образом:

BOOST_FOREACH(int& size, mmap | boost::adaptors::map_values)
{ 
    ++size;
}

Подробнее здесь.

Ответ 4

С С++ 11 рассмотрим использование ключевого слова auto:

std::map<int,int> mmap;    
mmap[1] = 1;
mmap[2] = 2;
mmap[3] = 3;

BOOST_FOREACH(auto& mpair, mmap)
    mpair.second++;

//mmap will contain {2,3,4} here