2

基本的に次のようなコードがあります。

std::map<int, int> map1, map2;
BOOST_FOREACH(int i, map1)
{
    // do steps 1-5 here...
}
BOOST_FOREACH(int i, map2)
{
    // do steps 1-5 (identical to above) here...
}

2 番目のループで重複するコードを排除するためにマップを連結する方法はありますか? または、BOOST_FOREACH を拡張して、2 つの異なるマップを一度に反復する方法はありますか? 明らかに、プログラムの時間の複雑さを増したくはありません (それ以外の場合は、新しいマップを作成してそれに map1 と map2 を挿入するだけです)。ここで初歩的な何かが欠けているような気がします。

4

6 に答える 6

9

関数を定義できます:

typedef std::map<int, int> IntMap;

void doStuffWithInt(IntMap::value_type &i)
{
  // steps 1 to 5
}

BOOST_FOREACH(IntMap::value_type &i, map1)
  doStuffWithInt(i);
BOOST_FOREACH(IntMap::value_type &i, map2)
  doStuffWithInt(i);

その場合、使用するのがさらに簡単になるかもしれませんがstd::for_each

for_each(map1.begin(), map1.end(), doStuffWithInt);
for_each(map2.begin(), map2.end(), doStuffWithInt);
于 2009-04-20T20:21:32.887 に答える
3

ここでの考え方は、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
}
于 2009-04-20T21:40:01.963 に答える
2

私がお勧めする 1800 年代のソリューションに加えて、さまざまなハッキーなソリューションもあります。

for (int stage = 0; stage < 2; stage++) {
    BOOST_FOREACH(int i, stage == 0 ? map1 : map2) {
        ...
    }
}

typedef std::map<int, int> intmap;
std::vector<intmap *> v;
v.push_back(&map1);
v.push_back(&map2);
BOOST_FOREACH(intmap *m, v) {
    BOOST_FOREACH(int i, *m) {
        ...
    }
}

注: 同僚がこのようなコードを書いているのを見ると、ときどき、彼らの首を絞めに行きたいという抑えがたい衝動に駆られます。自己責任。

于 2009-04-20T20:26:28.227 に答える
1

最も簡単な方法は次のとおりです。

std::map<int, int> map1, map2;
int key, value;
BOOST_FOREACH(boost::tie(key, value), boost::join(map1, map2))
{
    // do steps 1-5 here...
}

かっこが原因で、これらのコンマがプリプロセッサを混乱させないことを心配しないでください。

于 2012-01-24T01:55:59.277 に答える
0

ここ で説明 し ます.

あなたはこれを行うことができます:

std::map<int,int> m;
typedef std::pair<int,int> pair_t;
BOOST_FOREACH(pair_t p, m)
于 2011-10-27T21:30:00.100 に答える
0

頭のてっぺんから、私はしようと思います

std::map<int, int> map1, map2;
std::map<int, int>& maps = { map1, map2 }
BOOST_FOREACH(std::map<int, int> map, maps)
  BOOST_FOREACH(int i, map)
  {
      // do steps 1-5 here...
  }
于 2010-03-02T10:15:40.403 に答える