使用std :: equal或std :: all_of检查映射键是否已设置

时间:2018-11-08 19:32:32

标签: c++ predicate

我是C ++和谓语的新手,但遇到了问题。我正在尝试检查unordered_map中的所有键是否存在于set中,或者甚至存在于另一映射中具有不同值类型的键中。 本质上,是Python中的[key in set_ for key in map_.keys()][key in map2_ for key in map1_.keys()]

以下是一种方法:

for( auto itr = map_.begin(); itr != map_.end(); ++itr ) {
    if( set_.find( itr->first ) == set_.end() ) return false;
}

但是我想使用std::all_ofstd::equal来达到相同的目的。这是我到目前为止的内容:

some_function() {
    //set_ and map_ in scope
    areEqual = std::equal( map_.begin(), map_.end(), set_, 
        []( auto itr ){ return set_.find( itr->first ) != set_.end(); } );
}

编译器抱怨set_return set_.find(...)...范围之外

我也尝试过

class checker {  
public:  
    bool operator()( map_itr itr )  
    { return set_.find( itr->first ) != set_.end(); }
};

但是遇到了同样的问题。

非常感谢任何帮助或指针:)

1 个答案:

答案 0 :(得分:1)

默认情况下,Lambda无法访问在其作用域中声明的变量。为了从lambda函数访问set_变量,您应该在lambda函数中捕获

捕获列表是在lambda函数开头的[]个字符之间定义的。

在这种情况下,我将使用[&]通过引用从作用域中捕获所有对象,包括您的set_变量。

some_function() {
    areEqual = std::equal( map_.begin(), map_.end(), set_, 
        [&]( auto itr ){ return set_.find( itr->first ) != set_.end(); } );
}

您应该阅读cppreference上的Lambda expressions页以获取更多信息。