gpt4 book ai didi

c++ - 使用 std::equal 或 std::all_of 检查映射键是否在集合中

转载 作者:行者123 更新时间:2023-11-28 04:29:57 24 4
gpt4 key购买 nike

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

但遇到了同样的问题。

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

最佳答案

默认情况下,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(); } );
}

您应该阅读 Lambda expressions有关更多信息的 cppreference 页面。

关于c++ - 使用 std::equal 或 std::all_of 检查映射键是否在集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53214898/

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