![](/img/trans.png)
[英]Using std::any_of, std::all_of, std::none_of etc with std::map
[英]check map keys are in set using std::equal or std::all_of
我是C ++和谓语的新手,但遇到了问题。 我试图检查unordered_map
中的所有键是否存在于一个set
或者甚至存在于另一个具有不同值类型的映射中的键。 本质上, [key in set_ for key in map_.keys()]
[key in map2_ for key in map1_.keys()]
[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_of
或std::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(); } );
}
您应该阅读cppreference上的Lambda表达式页面以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.