在字符串的std :: map中查找编译错误,long

时间:2017-01-07 05:19:10

标签: c++ visual-studio compiler-errors stdmap

我正在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())

有人可以帮我解决这个问题吗?

由于

1 个答案:

答案 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));
}

Live Example

修改

Igor Tandetinik has reminded me map::insert

  

如果容器尚未包含具有等效键的元素,则将元素插入容器

意味着你的整个else - 块没有做任何事情,因为它只在map已经包含具有等效键的元素时触发。据推测,您打算使用map::insert_or_assign或类似内容,在这种情况下,您的整个代码应该简单地替换为:

++myMap["value"s]

<强> EDIT2:

请注意,上述方法有效,因为在C ++中,下标运算符的优先级高于前缀增量运算符。但是 myMap["value"s]++ 将不起作用,因为后缀增量的优先级高于下标运算符。有关运算符优先级的更多信息,请参阅C++ operator precedence chart

在这种情况下,这种排序是一件好事,因为它迫使您更好地编码决策。具体来说,在C ++中,最佳实践是使用前缀增量运算符而不是 postfix 增量运算符以获得优化原因(尽管在大多数情况下,现代编译器会为您最好地清理它练习仍然有效。)