0

我有这个:

unordered_map<string,string>* createDict(){

    unordered_map<string,string>* Dict= new unordered_map<string,string>();

    Dict["x"] = "a";
    Dict["y"] = "b";
    Dict["z"] = "c";

    return Dict;
}

我得到了错误:

表达式必须具有整数或无范围枚举类型

但这在堆栈上分配时有效。解决这个问题的最简单方法是什么?我真的不喜欢创建 Pair 对象以插入到 unordered_map 中。

4

2 回答 2

4

Dict是指向 an 的指针,std::unordered_map<std::string, std::string>但您使用它时就像它是一个对象一样。您需要适当地取消引用该对象,例如,使用

(*Dict)["x"] = "a";
Dict->operator[]("y") = "b";
std::unordered_map<std::string, std::string>& ref = *Dict;
ref["z"] = "c";

我更喜欢第一个选项或使用

Dict->insert(std::make_pair("x", "a"));

然而,它的语义略有不同:如果键存在,则在使用下标运算符时它不会做任何事情,并且赋值会更新值。

于 2013-09-20T22:09:58.487 回答
1

解决这个问题的最简单方法是什么?

使用通用初始化并只返回unordered_map而不是指针:

#include <unordered_map>
#include <string>

std::unordered_map<std::string, std::string> createDict(){
    return {{"x", "a"}, {"y", "b"}, {"z", "c"}};
}

int main() {
  auto xyz_dict = createDict();
}

编辑:根据您的评论,该数据结构将是某个类的成员变量,您可以在类中对其进行初始化:

struct A {
  using xyzDict = std::unordered_map<std::string, std::string>;
  xyzDict xyz_dict{{"x", "a"}, {"y", "b"}, {"z", "c"}};   
};

如果你的编译器不支持这个,那么只需xyz_dictcreateDict()构造函数的成员初始化列表中初始化。

于 2013-09-20T22:16:35.687 回答