2012-04-10 10 views
11

Iがあった場合(std::set_intersectのような)標準アルゴリズムでstd::set<MyData*>std::map<MyData*, MyValue>として定義された2つの構造間の相違点を交差するか、作るための方法を思ったんだけどstd :: mapとstd :: setを交差/ diffする方法はありますか?

問題は、私はセットとの間の差を計算する必要があるということです私はそれを再割り当てすることを避けたいと思っています(それは大規模なデータ構造で毎秒何回も実行されるものなので)。 std::mapの「キービュー」を取得する方法はありますか?結局のところ私が探しているのは、設定操作を行うときにキーを考慮することだけです。実装ポイントからは可能でなければなりませんが、何かを見つけることができませんでした。

+0

ブーストイテレータライブラリでfilter_iteratorを見てください。 –

+1

申し訳ありませんがfilter_iterator - transform_iteratorはありません。匿名の回答を参照してください。 –

答えて

8

あなたはstd::mapイテレータを適応すると、キーのみを返すために、ブーストからtransform_iteratorを使用することができます。注文したコレクションの

#include <algorithm> 
#include <iostream> 
#include <map> 
#include <iterator> 
#include <string> 
#include <set> 
#include <vector> 

#include <boost/iterator/transform_iterator.hpp> 

typedef std::map<std::string, int> map_t; 
typedef std::set<std::string> set_t; 

const map_t::key_type & getKey(const map_t::value_type & pair) 
{ 
    return pair.first; 
} 

typedef const map_t::key_type & (*getKey_t)(const map_t::value_type &); 

typedef boost::transform_iterator<getKey_t, map_t::iterator> key_iterator_t; 

int main() 
{ 
    map_t map; 
    map["a"]=1; map["b"]=2; 
    set_t set; 
    set.insert("a"); set.insert("c"); 

    std::vector<std::string> v; 

    std::set_intersection(set.begin(), set.end(), 
     key_iterator_t(map.begin(), getKey), 
     key_iterator_t(map.end(), getKey), 
     std::back_inserter(v)); 
    std::copy(v.begin(), v.end(), 
     std::ostream_iterator<std::string>(std::cout," , ")); 
} 
1

set_intersection作品を。標準マップイテレータをラップし、キーを返すカスタムイテレータを書くことができます。これを次に使用することができますset_intersect

関連する問題