используя BOOST_FOREACH с std :: map - PullRequest
45 голосов
/ 28 апреля 2009

Я бы хотел перебрать 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
    ]

Есть предложения?

Ответы [ 4 ]

68 голосов
/ 28 апреля 2009

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

typedef std::map<int, int> map_t;
map_t mmap;  
BOOST_FOREACH( map_t::value_type &i, mmap )
    i.second++;
21 голосов
/ 05 октября 2012

Это старая ветка, но есть более удобное решение.

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

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

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

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

4 голосов
/ 04 августа 2010

Другой вариант - использовать BOOST_FOREACH_PAIR, см. Мой ответ здесь:

BOOST_FOREACH & шаблоны без typedef

0 голосов
/ 17 августа 2015

Начиная с C ++ 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
...