[英]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.