有没有办法交叉/比较标准::地图和标准::集
Is there a way to intersect/diff a std::map and a std::set?
我想知道是否有办法在定义为std::set<MyData*>
和std::map<MyData*, MyValue>
的两个结构之间进行交叉或差异,并使用标准算法(如std::set_intersect
)
问题是我需要计算映射的集合和键集之间的差异,但我想避免重新分配它(因为它是每秒使用大数据结构多次完成的事情)。有没有办法获得std::map
的"关键视图"?毕竟,我正在寻找的是执行设置操作时只考虑键,因此从实现点来看应该是可能的,但我找不到任何东西。
您可以使用 boost 中的transform_iterator
来适应std::map
迭代器并仅返回键:
#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," , "));
}
set_intersection适用于有序集合。 您可以编写一个自定义迭代器来包装标准映射迭代器并返回密钥。 然后,您可以将其与set_intersect
一起使用
相关文章:
- 如何将元素插入到标准::地图的共享指针中?
- 无法插入到标准地图
- 如何将 tbb concurrent_hash_map转换为常规标准::地图?
- 如何比较标准::地图中的所有项目?
- C++带有标准::地图的向量?
- 复杂的标准::地图,结构,标准::d问题
- 可以提示插入到标准::地图导致不平衡的树
- 标准地图如何知道使用标准字符串的数据作为键
- 了解标准::地图::查找
- 标准::地图使用.这是怎么回事?核心转储?我做得不正确?
- 在编译指示包中包含标准地图会导致崩溃
- 标准::地图比较功能
- 内存效率标准::地图替代
- 删除标准地图中的重复值
- 自动填充标准::地图
- 标准地图给出分段错误
- C++ 动态分配标准::地图比较器
- 标准::地图未按预期运行
- 清除多级标准::地图
- 有没有办法交叉/比较标准::地图和标准::集