标准::映射与λ比较器
std::map with lambda comparator
我下面的代码给了我编译器错误,我不明白我做错了什么。谁能帮忙?
基本上,我所要做的就是通过引用将 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
完全无关。
相关文章:
- 定义具有非标准签名的自定义映射比较器
- 如何为映射和priority_queue编写比较器,其中元素是二维数组
- 使用更大的比较器初始化映射
- STL映射比较器能否以某种方式获取指向映射本身的指针?
- 使用自定义比较器C++映射,不插入所有元素
- C++ priority_queue使用带有 lambda 比较器错误的映射
- C++:对象键的多映射自定义比较器
- C++函数来返回基于参数的比较器通用映射类型?
- c++中一对对象的映射比较器
- 映射的 Lambda 键比较器
- STL 映射自定义比较器
- 将带有自定义比较器的映射传递到功能
- 带有自定义比较器的映射不起作用
- 是否有映射的查找()以使用带参数的比较器
- 成员功能作为映射比较器
- 标准::映射与λ比较器
- 映射运算符<条件 - 无效的比较器
- 使用自己的比较器运算符()进行映射<>。在找不到 KEY 的情况下给出错误
- c++比较器函数,为映射指定特定的键顺序
- 具有透明比较器和异构意义上的非唯一元素的映射或集合