我有map<int,string>
为每个name
添加id
。
我有办法做到这一点。
void User::add(int id, string name) {
map<int, string>::iterator it = map.find(id);
if (it == map.end()) {
map.insert(pair<int, string>(id, name));
} else {
it->second = name;
}
}
它工作得非常好。但我想学习如何使用operator []将字符串添加到地图中。以下是我的代码:
void user::add(int id, string name) {
&auto findUser = map[id];//check if an user exists
findUser.push_back(string()); // add a new string object
findUser.push_back(name); // put string into the map
}
当我运行此代码时,它给了我一个错误:没有可靠的转换来自&#39;字符串&#39;
答案 0 :(得分:4)
&auto findUser = map[id];//check if an user exists
首先,我假设领先的&
是一个拼写错误,因为它在宣言的那一边毫无意义。
map[id]
将找到映射到id的字符串。如果没有这样的字符串the map will invent one, stuff it into the map, and return a reference to the brand new string。您将始终返回一个字符串引用。
因为您将返回一个字符串引用,auto findUser
将是一个字符串引用。其余的代码试图将字符串推入字符串,你已经看到了结果。这是auto
的危险之一。尽管我喜欢它,它隐藏了OP的实际数据类型,并使错误消息更加神秘。
您无法使用[]
有效地检查地图中的状态。当然,你可以测试空字符串,但现在你有一个空字符串使你的地图混乱。很快,你在地图上有很多空字符串。不是一个好的解决方案。
map.find与测试存在性一样好。下一个最好的可能是map.at(id),因为如果找不到id,它将抛出异常。
从好的方面来说,因为[]
返回对映射类型的引用,所以它可以像使用数组一样使用。
name = map[id];
map[id] = name;
都有效。你也可以拿一个指针,但这带来了风险。如果地图被更改,您的指针可能无效。
答案 1 :(得分:2)
这很简单:
void user::add(int id, string name)
{
map[id] = name;
}