gpt4 book ai didi

c++ - 有没有办法交叉/区分 std::map 和 std::set?

转载 作者:可可西里 更新时间:2023-11-01 15:20:26 30 4
gpt4 key购买 nike

我想知道是否有办法在定义为 std::set<MyData*> 的两个结构之间进行交叉或区分和 std::map<MyData*, MyValue>使用标准算法(如 std::set_intersect )

问题是我需要计算 map 的集合和键集之间的差异,但我想避免重新分配它(因为它是每秒对大型数据结构进行多次的操作)。有没有办法获得 std::map 的“关键 View ”? ?毕竟我正在寻找的是在执行设置操作时只考虑键,所以从实现的角度来看应该是可能的,但我还没有找到任何东西。

最佳答案

您可以使用 transform_iterator来自 boost 以适应 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," , "));
}

关于c++ - 有没有办法交叉/区分 std::map 和 std::set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090686/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com