C++ 带有lambda比较器的std::map
我下面的代码给了我一个编译器错误,我不明白我做错了什么。有人能帮忙吗 基本上,我所要做的就是通过引用一个函数来传递一个STL映射容器,这个函数将填充它。这个映射容器还有一个与之关联的比较器lambdaC++ 带有lambda比较器的std::map,c++,c++11,stl,lambda,C++,C++11,Stl,Lambda,我下面的代码给了我一个编译器错误,我不明白我做错了什么。有人能帮忙吗 基本上,我所要做的就是通过引用一个函数来传递一个STL映射容器,这个函数将填充它。这个映射容器还有一个与之关联的比较器lambda #include "stdafx.h" #include <functional> #include <map> using namespace std; typedef struct _tagAddressBook { string strFirstName;
#include "stdafx.h"
#include <functional>
#include <map>
using namespace std;
typedef struct _tagAddressBook
{
string strFirstName;
string strLastName;
long nZipCode;
} AddressBook;
void foo(map<string, AddressBook, function<bool(const string&, const string&)>> &myAddressBook)
{
AddressBook addressBookInstance;
addressBookInstance.strFirstName = "Bob";
addressBookInstance.strLastName = "Parker";
addressBookInstance.nZipCode = 12345;
myAddressBook.insert(std::pair<string, AddressBook>(addressBookInstance.strFirstName, addressBookInstance));
}
int _tmain(int argc, _TCHAR* argv[])
{
auto myComparator = [] (const string &strLeft, const string &strRight) { return(strLeft.compare(strRight) <= 0 ? true : false); };
map<string, AddressBook, decltype(myComparator)> myAddressBook(myComparator);
foo(myAddressBook);
return 0;
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
typedef结构\u标记地址簿
{
字符串strFirstName;
字符串strLastName;
长nZipCode;
}通讯录;
void foo(地图和myAddressBook)
{
AddressBookAddressBookInstance;
addressBookInstance.strFirstName=“Bob”;
addressBookInstance.strLastName=“Parker”;
addressBookInstance.nZipCode=12345;
插入(std::pair(addressBookInstance.strFirstName,addressBookInstance));
}
int _tmain(int argc,_TCHAR*argv[]
{
auto myComparator=[](const string&strLeft,const string&strRight){return(strLeft.compare(strRight)Lambda函数与std::function
无关。事实上,每个函数都有自己的类类型。如果您想做看起来像做的事情,可以通过foo
通过模板来做,然后让演绎来排序
template <typename Cmp>
void foo(map<std::string, AddressBook, Cmp> &myAddressBook)
{
AddressBook addressBookInstance;
addressBookInstance.strFirstName = "Bob";
addressBookInstance.strLastName = "Parker";
addressBookInstance.nZipCode = 12345;
myAddressBook.insert(std::pair<string, AddressBook>(addressBookInstance.strFirstName, addressBookInstance));
}
模板
void foo(地图和myAddressBook)
{
AddressBookAddressBookInstance;
addressBookInstance.strFirstName=“Bob”;
addressBookInstance.strLastName=“Parker”;
addressBookInstance.nZipCode=12345;
插入(std::pair(addressBookInstance.strFirstName,addressBookInstance));
}
这适用于我的工具链“Apple LLVM 5.0版(clang-500.2.75)(基于LLVM 3.3svn)”。我看不出它也适用于你的工具链的原因。请使用别名:
using AdressBookMap = map<string, AddressBook, function<bool(const string&, const string&)>>;
正如Whoz所说,lambda不是std::function
;后者可以从前者隐式构造,但它们没有相同的类型。这意味着一个参数化的std::map
与另一个参数化的std::map
完全无关。lambda与std::function没有任何关系。它们是他们自己的类类型。可能与我尝试过的类类型相同,但它在VS2012上无法编译。它似乎在gcc上工作。我尝试过
using AdressBookMap = map<string, AddressBook, function<bool(const string&, const string&)>>;
void foo(AddressBookMap& myAddressBook)
{
// ...
}
int main(int argc, char* argv[])
{
auto myComparator = [] (...) { ... };
AddressBookMap myAddressBook(myComparator);
foo(myAddressBook);
return 0;
}