标准::映射与λ比较器

std::map with lambda comparator

本文关键字:比较器 映射 标准      更新时间:2023-10-16

我下面的代码给了我编译器错误,我不明白我做错了什么。谁能帮忙?

基本上,我所要做的就是通过引用将 STL 映射容器传递给一个可以填充它的函数。此映射容器还具有与之关联的比较器 lambda。

#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;
}

我在VS2012上收到以下编译错误

错误 1

错误 C2664:"foo":无法将参数 1 从"std::map<_Kty,_Ty,_Pr>"转换为"std::map<_Kty,_Ty,_Pr> &' d:\my projects\mapwithlambdacomparator\mapwithlambdacomparator\mapwithlambdacomparator.cpp 32

2   IntelliSense: a reference of type "std::map<std::string, AddressBook, std::function<bool (const std::string &, const std::string &)>, std::allocator<std::pair<const std::string, AddressBook>>> &" (not const-qualified) cannot be initialized with a value of type "std::map<std::string, AddressBook, lambda []bool (const std::string &strLeft, const std::string &strRight)->bool, std::allocator<std::pair<const std::string, AddressBook>>>" d:My ProjectsMapWithLambdaComparatorMapWithLambdaComparatorMapWithLambdaComparator.cpp  32

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));
}

这适用于我的工具链"Apple LLVM version 5.0 (clang-500.2.75) (基于 LLVM 3.3svn)"。我认为它没有理由不适用于您的工具链。

请制作别名:

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;
}

正如Whoz所说,lambdas不是std::function;后者可以从前者隐式构造,但它们没有相同的类型。这意味着由一个参数化的std::map与另一个参数化的std::map完全无关。