【问题标题】:check map keys are in set using std::equal or std::all_of使用 std::equal 或 std::all_of 检查映射键是否在集合中
【发布时间】:2018-11-08 19:32:31
【问题描述】:

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

一种方法如下:

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(); }
};

但遇到了同样的问题。

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

【问题讨论】:

  • 你必须捕获集:[&set_](..){..}.
  • @Jarod42 我不太习惯排序范围算法,在std::unordered_map 的情况下它真的可以工作吗?
  • 设置操作需要排序范围,因此与unordered_*不兼容。

标签: c++ predicate


【解决方案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 页面以获取更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2021-11-10
    • 2023-04-08
    • 2015-04-22
    相关资源
    最近更新 更多