簡體   English   中英

如何將lambda用於std :: find_if

[英]How to use lambda for std::find_if

我試圖使用std :: find_if來查找符合某些條件的對象。 考慮以下:

struct MyStruct         
{
    MyStruct(const int & id) : m_id(id) {}                      
    int m_id;
};
...         
std::vector<MyStruct> myVector; //... assume it contains things

MyStruct toFind(1);
std::vector<MyStruct>::iterator i = std::find_if(myVector.begin(), myVector.end(), ???);

我不知道該放什么???

我見過的所有示例都有一個lambda,它使用硬編碼值來檢查ID。 我想要的是只有當toFind的id與向量中某個項的id匹配時才返回迭代器/成功。

我看到的所有示例都沒有告訴我如何傳遞這兩個參數

編輯

附加信息我有兩種不同的場景我必須使用它,其中有一個結構的==運算符和另一個結構沒有運算符== - 我不能創建一個因為標准找到這種情況的匹配並不像對等運算符那樣嚴格。

(感謝所有回復的人;我能夠在一個案例中使用find()並且在你的幫助下能夠使用find_if()進行另一個案例)

嘗試這個:

std::find_if(
    myVector.begin(), myVector.end(),
    [&toFind](const MyStruct& x) { return x.m_id == toFind.m_id;});

或者,如果您為MyStruct定義了適當的==重載, MyStruct可以使用find

std::find(myVector.begin(), myVector.end(), toFind);  // requires ==

當你有某種異構查找時, find_if版本通常是最好的,例如,如果你只是給了一個int ,而不是MyStruct的值。

這是lambda捕獲發揮作用的地方。 除了說明將哪種類型的參數傳遞給lambda之外,您還可以說明使用哪些現有變量來構造lambda。 所以在這種情況下你會有類似的東西

std::vector<MyStruct>::iterator i = std::find_if(myVector.begin(),
    myVector.end(), 
    [&](const auto& val){ return val.m_id == toFind.m_id; } );

所以[&]表示通過引用捕獲lambda體中使用的所有變量。 (const auto& val)使lambda的operator()成為模板,並允許您接受任何類型。 然后在正文中我們比較從find_if傳遞到toFind

您可以使用以下內容:

MyStruct toFind(1);
std::vector<MyStruct>::iterator i =
    std::find_if(myVector.begin(), myVector.end(),
                 [&](const auto& e) { return e.id == toFind.id; });

請執行以下操作:

std::find_if(myVector.begin(), myVector.end(), 
          [&toFind] (const auto &ele) { return ele.m_id == toFind.m_id}; );

暫無
暫無

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

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