Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从2个std::maps获取公共密钥的更好方法_C++_C++11 - Fatal编程技术网

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
注意,在实践中,这有几个问题是错误的,即使事实上,如果您有访问权限,范围是一个更好的方法:

  • 具有两个以上的模板参数。因此,将Compare和Allocator参数添加到列表中
  • 如果他们有不同的比较类型呢?现在我们可能无法满足
    设置交叉点的要求
  • 如果它们具有相同的比较类型,但由一个对每个实例执行不同操作的有状态的比较器构造,会怎么样?奇怪,但有可能。。。我们仍然不满足订购约束,但检查成本更高

  • 因此,为了准确无误,您应该使用例如
    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参数添加到列表中”-或使用可变模板。实际上,最好使用单个类型的param
    SortedContainer
    std::ranges::set_intersection(std::ranges::keys_view(map1), std::ranges::keys_view(map2), std::back_inserter(shared_keys));