我不知道是否有办法相交或使std::map<MyData*, MyValue>
用标准算法(如std::set_intersect
)有没有办法相交/ diff一个std :: map和一个std :: set?
的问题是,我需要计算所述一组和之间的差定义为std::set<MyData*>
两个结构和之间的差异但我想避免重新分配它(因为它是每秒钟处理大量数据结构的东西)。有没有办法获得std::map
的“关键视图”?毕竟,我正在寻找的是在进行set操作时只考虑关键字,因此从实现的角度来看,它应该是可能的,但我一直无法找到任何东西。在有序的集合
#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," , "));
}
查看boost迭代器库中的filter_iterator。 – 2012-04-10 14:37:12
对不起,不是filter_iterator - transform_iterator。请参阅匿名的答案。 – 2012-04-10 14:50:26