2015-10-28 37 views
1

我想創建一個查找函數,它根據給定的lambda表達式工作,並匹配給定的字符(其變化)。 我嘗試使用lambda表達式,但lambda表達式中的匹配是一個常量字符。根據我的意願,我不能改變lambda表達式。我有一個vector < pair <char, char> > r。 我想要做的是,如何創建自定義查找功能?

運行此矢量,看看是否有任何r[i].second匹配我的給定的字符。在這裏,給定的字符是字符串的一部分,因此會隨着迭代而變化,所以我無法將其修正到lambda表達式中,我也不能將參數傳遞給lambda表達式來解決這個問題。

bool findfn (pair <char, char> x) 
{ 
    return x.second == mychar // I want to pass mychar as argument 
} 

一種可能性是使用lambda表達式,這在vincentp的答案中有解釋。我們是否也可以使用上面顯示的findfn來做到這一點?調用代碼如下所示:

find(r.begin(), r.end(), findfn)

+0

等待你不能改變的拉姆達?爲什麼不?請至少僞造你想要做的事情。 – NathanOliver

+0

在發佈這個問題之前,我不知道我們可以使用lambda的各種方式。 ([]中的參數) – anukul

+0

你不能使用find_if代替find嗎?如果你這樣做工作正常。 – vincentp

回答

4

您可以創建一個lambda並捕獲在lambda捕獲列表中mychar變量:

char mychar = 'A'; 
// ... 
auto findfn = [mychar](pair<char, char> x) -> bool { return x.second == mychar; }; 
+0

謝謝。任何方式發送'mychar'到函數? – anukul

+0

@AnukulSangwan你說的是相當不清楚的。你可以編輯你的問題,以顯示你希望調用代碼看起來如何?它可以是僞代碼。 – Angew

+0

@vincentp如果你通過引用捕獲'mychar',那麼它甚至會響應'mychar'中的變化,我理解OP的想法。 – Walter

2

如果我理解正確的話,那麼std::bind能解決您的問題。它基本上採用一個函數,將某些值綁定到某些參數,並返回一個期望參數較少的函數。 例子:

#include <functional> 
//... 
auto findfn = [](pair<char,char> x, char mychar) { return x.second == mychar }; 
char yourchar = 'a'; 
find_if(r.begin(), r.end(), std::bind(findfn, std::placeholder::_1, yourchar)); 

編輯:在我的防守,你說,你想傳遞一個附加參數。如果你可以使用捕獲列表,這當然會更容易,但std::bind的方法更一般。

1

你可以寫一個接受mychar,並返回使用mychar lambda函數的函數:

std::function<bool(std::pair<char, char>)> findFor(char mychar) 
{ 
    return [mychar](std::pair<char, char> x) { return x.second == mychar; }; 
} 

it = find_if(r.begin(), r.end(), findFor('a'));