我正在VC ++中使用Visual Studio 2013。 我有一个std :: map如下,
std::map<std::string, unsigned int> myMap;
作为类的静态成员。
我通过这样做填充值,
string key = "value";
std::map<std::string, unsigned int>::iterator it = myMap.find(key);
if(it == myMap.end())
myMap.insert(std::pair<std::string, unsigned int> (key, 1));
else
{
int prev_value = it->second;
prev_value++;
myMap.insert(std::pair<std::string, unsigned int> (key, prev_value));
}
这不编译,我得到这个编译错误,
1 IntelliSense: no suitable user-defined conversion from "std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, long>>>>" to "std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, unsigned int>>>>" exists c:\filename.cpp 15
15就是这一行,
std::map<std::string, unsigned int>::iterator it = myMap.find(key);
和这个错误,
2 IntelliSense: no operator "==" matches these operands
operand types are: std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, unsigned int>>>> == std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string, long>>>> c:\filename.cpp 17
第17行就是这个,
if(it == myMap.end())
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:1)
你wouldn't be getting this error如果你的声明实际上是:
std::map<std::string, unsigned int> myMap
如果您的定义是偶然的,那么您会get this exact error:
std::map<std::string, long> myMap
在着名的Almost Always Auto中,Herb Sutter假设指南:
请记住,偏好
auto
变量的主要原因是正确性,性能,可维护性和健壮性 - 而且最后只是打字方便。
正如Herb Sutter建议auto
(和make_pair
)不仅会使您的代码更正,而且会使其更加健壮,也就是说它会支持myMap
独立于您使用的上述声明中的哪一项:
const string key = "value"s;
const auto it = arg.find(key);
if(it == arg.end()) {
arg.insert(make_pair(key, 1));
} else {
int prev_value = it->second;
prev_value++;
arg.insert(make_pair(key, prev_value));
}
修改强>
Igor Tandetinik has reminded me map::insert
:
如果容器尚未包含具有等效键的元素,则将元素插入容器
意味着你的整个else
- 块没有做任何事情,因为它只在map
已经包含具有等效键的元素时触发。据推测,您打算使用map::insert_or_assign
或类似内容,在这种情况下,您的整个代码应该简单地替换为:
++myMap["value"s]
<强> EDIT2:强>
请注意,上述方法有效,因为在C ++中,下标运算符的优先级高于前缀增量运算符。但是 将不起作用,因为后缀增量的优先级高于下标运算符。有关运算符优先级的更多信息,请参阅C++ operator precedence chart。 myMap["value"s]++
在这种情况下,这种排序是一件好事,因为它迫使您更好地编码决策。具体来说,在C ++中,最佳实践是使用前缀增量运算符而不是 postfix 增量运算符以获得优化原因(尽管在大多数情况下,现代编译器会为您最好地清理它练习仍然有效。)