Идея состоит в том, чтобы написать специальный тип итераторов для виртуального объединения двух контейнеров, что касается BOOST_FOREACH. Обратите внимание, что я не создаю новый контейнер из двух существующих. Я просто прыгаю с конца первого контейнера end () на итератор begin () второго контейнера.
Я не пытался написать реальный класс merged_iterator, но, хотя он может быть немного длинным, технически это не сложно. Я на самом деле удивлен, что не нашел что-то подобное с помощью Google. Я долго не смотрел!
template<typename Container>
boost::iterator_range<
merged_iterator<Container::iterator>
>
concat_containers( Container& c1, Container& c2 )
{
typedef merged_iterator<typename Container::iterator> MergedIterator;
typedef boost::iterator_range<MergedIterator> IteratorRange;
return IteratorRange(
MergeIterator( c1.begin(), c1.end(), c2.begin(), c2.end() ),
MergeIterator( c2.end(), c1.end(), c2.begin(), c2.end() ) );
}
// Now use a bit of magic to define merged_iterator<...>
// And you'll be able to write
BOOST_FOREACH( std::pair<int, int> i, concat_containers( map1, map2 ) )
{
// Do whatever you want here
}