簡體   English   中英

使用std :: equal或std :: all_of檢查映射鍵是否已設置

[英]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_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(); } );
}

您應該閱讀cppreference上的Lambda表達式頁面以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM