2012-04-10 21 views
11

merak ediyorum eğer orada kesişen iki std::set<MyData*> olarak tanımlanan yapılar ve standart algoritmalar ile std::map<MyData*, MyValue> (std::set_intersect gibi)Std :: map ve std :: set'in kesişmesi/dağıtılması için bir yol var mı?

sorun Sette arasındaki farkı hesaplamak gerekir olmasıdır arasındaki farklılıkları yapmak için bir yol haritanın klavyesi ancak yeniden tahsis edilmekten kaçınmak istiyorum (çünkü büyük veri yapılarıyla saniyede birçok kez yapılan bir şeydir). std::map'un "anahtar görünümünü" elde etmenin bir yolu var mı? Her şeyden sonra baktığım şey, bir operasyon noktasından ayarlanmış işlemi yaparken sadece anahtarları göz önünde bulundurmaktır, bu yüzden mümkün olmalıdır ama hiçbir şey bulamadım. sipariş koleksiyonları üzerinde

#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," , ")); 
} 
+0

ile kullanabilirsiniz. Yükseltme yineleyici kitaplığında filter_iterator'a göz atın. –

+1

Üzgünüm, filter_iterator - transform_iterator değil. Anonim 'yanıtına bakın. –

cevap

8

Sen amacıyla std::map yineleyici uyarlamak ve sadece anahtarlarını dönmek için baskının transform_iterator kullanabilirsiniz. Standart harita yineleyicisini saran ve anahtarı döndüren özel bir yineleyici yazabilirsiniz. Bunu daha sonra set_intersect

İlgili konular