我需要查找地圖中呈現的矢量元素。難題在於該向量由結構組成,所以您應該首先調用成員函數來從結構中提取值,以將其與地圖元素進行比較。查找地圖中呈現的矢量元素
因此,與循環這是很容易:
vector<A>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
{
if(mp.count(it->getKey()))
{
break;
}
}
我的問題:有沒有辦法做到這一點的一條線,像
//this doesn't work as count accepts key_type
vector<A>::iterator it = find_if(vec.begin(), vec.end(), boost::bind(&map<string, string>::count, mp, boost::bind(&A::getKey, _1))) != 0);
完整的示例,來測試
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <boost/bind.hpp>
#include <boost/assign.hpp>
using namespace std;
class A{
public:
A(const std::string& key)
: key(key) {}
std::string getKey(){ return key; }
private:
std::string key;
};
int main(int argc, const char *argv[]) {
map<string, string> mp = boost::assign::map_list_of("Key1", "Val1") ("Key2", "Val2") ("Key3", "Val3");
vector<A> vec = boost::assign::list_of("AAA") ("Key2") ("BBB");
// vector<A>::iterator it = find_if(vec.begin(), vec.end(), boost::bind(&map<string, string>::count, mp, boost::bind(&A::getKey, _1))) != 0);
vector<A>::iterator it;
for(it = vec.begin(); it != vec.end(); ++it)
{
if(mp.count(it->getKey()))
{
break;
}
}
cout << (it != vec.end() ? "found" : "not found") << endl;
return 0;
}
在此先感謝
嗨,這個工程。我相信問題不在於大括號的數量,而在...&mp ...我錯過了&。 – Alex 2013-05-14 11:58:54
@亞歷克斯:很高興它適合你。通過值而不是指針傳遞'mp'只是一種優化,因爲'mp'可以被複制。問題是額外的括號。 [這](http://coliru.stacked-crooked.com/view?id = b2a625da792e0c3b7e7b203b9053ca65-7063104e283ed82d51a6fde7370c6e59)在線編譯器失敗,因爲它無法找到運算符!=採用迭代器(從find_if返回)和int(0)。刪除多餘的括號會導致'!= 0'使用'boost :: bind'運算符重載,而不是試圖與'find_if'的返回值進行比較。 – 2013-05-14 12:38:54