我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;
}
}
它工作得很好。但是我想学习如何使用运算符[]将字符串添加到映射中。下面是我的代码:
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
}
当我运行此代码时,它给了我一个错误:'string'没有可行的转换
&auto findUser = map[id];//check if an user exists
首先,我认为&
开头是拼写错误,因为在声明的那一边它是没有意义的。
map[id]
将查找映射到id的字符串。如果没有这样的字符串,则映射将发明一个字符串,将其填充到映射中,并返回对全新字符串的引用。您将始终获得一个字符串引用。
因为将返回一个字符串引用,所以auto findUser
将是一个字符串引用。其余的代码试图将字符串推入字符串,您已经看到了结果。这是的危险之一auto
。我非常喜欢它,它从OP隐藏了实际的数据类型,并使错误消息变得更加不可思议。
您不能[]
有效地检查地图中是否存在。当然,您可以测试是否有空字符串,但是现在您的空字符串杂乱了地图。很快,您在地图中就会有许多空字符串。不是一个好的解决方案。
map.find与测试存在性一样好。次佳的选择可能是map.at(id),因为如果找不到ID,它将抛出异常。
从好的方面[]
来看,由于返回对映射类型的引用,因此可以像使用数组一样使用它。
name = map[id];
map[id] = name;
都是有效的。您也可以使用指针,但这会带来风险。如果更改了地图,则您的指针可能无效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句