C++ 从2个std::maps获取公共密钥的更好方法
我引用了两个类型为C++ 从2个std::maps获取公共密钥的更好方法,c++,c++11,C++,C++11,我引用了两个类型为std::map的映射。我想创建一个主列表,其中包含两个贴图共有的所有键。我目前的解决方案如下,但我想知道是否有更有效的方法来解决这个问题 const std::map和map1; const std::map和map2; std::向量共享密钥; //仅当两者都包含作为键的字符串时才添加到主列表 用于(自动输入:map1(&E){ if(map2.find(entry.first)!=map2.end(){ 共享_键。向后推_键(输入。第一); } } 如果我可以完全放弃
std::map
的映射。我想创建一个主列表,其中包含两个贴图共有的所有键。我目前的解决方案如下,但我想知道是否有更有效的方法来解决这个问题
const std::map和map1;
const std::map和map2;
std::向量共享密钥;
//仅当两者都包含作为键的字符串时才添加到主列表
用于(自动输入:map1(&E){
if(map2.find(entry.first)!=map2.end(){
共享_键。向后推_键(输入。第一);
}
}
如果我可以完全放弃for循环/将其作为“一行程序”来执行,但不确定如何实现…
std::map
已排序,因此您可以直接使用
您将需要一个自定义比较器,因为您只比较键。。。然后您需要一个适配器来只使用输出迭代器中的键
除非您使用类似于Boost.Iterator适配器的东西,否则一行程序正在推动它。草图(未经测试):
模板
矢量地图关键交叉点(地图常数和a、地图常数和b)
{
矢量结果;
使用Elem=typename映射::value\u type;
设置交叉点(a.开始(),a.结束(),
b、 begin(),b.end(),
boost::make_函数\u输出\u迭代器(
[&result](Elem const&e){result.push_back(e.first);}),
[](Elem const&a,Elem const&b){返回a.first
注意,在实践中,这有几个问题是错误的,即使事实上,如果您有访问权限,范围是一个更好的方法:
设置交叉点的要求
因此,为了准确无误,您应该使用例如
a.value\u comp()
而不是裸操作符std::map
进行排序,因此您可以直接使用
您将需要一个自定义比较器,因为您只比较键。。。然后您需要一个适配器来只使用输出迭代器中的键
除非您使用类似于Boost.Iterator适配器的东西,否则一行程序正在推动它。草图(未经测试):
模板
矢量地图关键交叉点(地图常数和a、地图常数和b)
{
矢量结果;
使用Elem=typename映射::value\u type;
设置交叉点(a.开始(),a.结束(),
b、 begin(),b.end(),
boost::make_函数\u输出\u迭代器(
[&result](Elem const&e){result.push_back(e.first);}),
[](Elem const&a,Elem const&b){返回a.first
注意,在实践中,这有几个问题是错误的,即使事实上,如果您有访问权限,范围是一个更好的方法:
具有两个以上的模板参数。因此,将Compare和Allocator参数添加到列表中
如果他们有不同的比较类型呢?现在我们可能无法满足设置交叉点的要求
如果它们具有相同的比较类型,但由一个对每个实例执行不同操作的有状态的比较器构造,会怎么样?奇怪,但有可能。。。我们仍然不满足订购约束,但检查成本更高
因此,为了准确无误,您应该使用例如a.value\u comp()
而不是您可以使用的裸运算符,尽管作为一个线性,您也可以从其中一个映射中获取值
std::vector<std::pair<const std::string, int>> shared;
std::set_intersection(map1.begin(), map1.end(), map2.begin(), map2.end(), std::back_inserter(shared), map1.value_comp());
您可以使用,尽管作为一条直线,您也可以从其中一个贴图中获取值
std::vector<std::pair<const std::string, int>> shared;
std::set_intersection(map1.begin(), map1.end(), map2.begin(), map2.end(), std::back_inserter(shared), map1.value_comp());
std::map::value\u comp()
是对std::pair
中的第一个进行比较的好方法!我试图避免陷入复杂的细节中……std::map
有两个以上的模板参数。因此,将Compare和Allocator参数添加到列表中”-或使用可变模板。最好使用单个类型的参数SortedContainer
,实际上std::map::value\u comp()
是对std::pair
中的第一个进行比较的好方法!我试图避免陷入复杂的细节中……std::map
有两个以上的模板参数。因此,将Compare和Allocator参数添加到列表中”-或使用可变模板。实际上,最好使用单个类型的paramSortedContainer
std::ranges::set_intersection(std::ranges::keys_view(map1), std::ranges::keys_view(map2), std::back_inserter(shared_keys));