ここでの考え方は、BOOST_FOREACHに関する限り、2つのコンテナーを仮想的にマージするための特別なタイプのイテレーターを作成することです。2つの既存のコンテナから新しいコンテナを作成していないことに注意してください。最初のコンテナのend()から2番目のコンテナのbegin()イテレータにジャンプしているだけです。実際のmerged_iteratorクラスを作成しようとはしませんでしたが、作成するのに少し時間がかかるかもしれませんが、技術的には難しくありません。グーグルを使ってそのようなものを見つけられなかったのは実際に驚いています。でも、長くは探していませんでした!
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
}