插入stl :: map的问题

时间:2014-07-12 02:30:42

标签: c++ stl function-pointers

我正在尝试使用<function name, function ptr>

创建std::map
typedef int(*FnPtr)()

int Foo()
{
    return 1;
}

map<const char*, FnPtr> funcMap;
funcMap.insert("Foo", Foo);        // Error

我收到以下错误消息:

Error: no instance of overloaded function "std:map<_Kty, _Ty, _Pr, _Alloc>::insert[with _Kty=const char*, _Ty=FnPtr,_Pr=std::less < const char * > , _Alloc=std::allocator< std::pair< const char* const, FnPtr>>]" matches the argument list

argument types are: (const char[3], void())

对象类型是:

std::map< const char*, FnPtr, std::less < const char *>, std::allocator< std::pair < const char* const, FnPtr>>>

std:map不支持自定义类型吗?

3 个答案:

答案 0 :(得分:3)

map::insertstd::pair为参数,因此您需要

funcMap.insert(std::make_pair("Foo", Foo));

这将修复编译错误,但是,假设您关心元素的排序,那么map的行为可能不如您预期的那样。根据定义,您的密钥将具有任意顺序,具体取决于编译器将字符串文字放置在内存中的地址,因为映射比较器将比较字符串文字的地址,而不是它们的内容。

如果您希望按字符串内容排序键,那么最简单的方法是将map更改为

std::map<std::string, FnPtr> funcMap;

如果您想避免使用std::string,并且只使用字符串文字,那么您可以定义一个自定义比较器来比较字符串

#include <cstring>

struct str_literal_less
{
    bool operator()(char const *l, char const *r) const
    { return std::strcmp(l, r) < 0; }
};

然后将地图定义为

std::map<char const *, FnPtr, str_literal_less> funcMap;

答案 1 :(得分:1)

您必须在地图中插入一对。尝试:

funcMap.insert(make_pair("Foo", Foo));

如果你有C ++ 11支持,你可以

funcMap.insert({"Foo", Foo});

或者,你为什么不能这样做呢?

funcMap["Foo"] = Foo;

答案 2 :(得分:1)

你必须改变

funcMap.insert("Foo", Foo);

funcMap.insert(make_pair("Foo", Foo));

有关详细信息,请参阅此处http://www.cplusplus.com/reference/map/map/insert/