当我收到错误提示我使用.
运算符从地图访问一对中的值时,我感到困惑,因为当我在代码中的两个位置更改它时,我收到一个新错误,提示我在代码的第二位使用了->
。我听了naggy编译器。我为什么需要?
这就是我在做的事情:
在基于for循环的范围内,我想要键值对中的值,这可以是示例:
std::map<std::string, aclass> mapthings;
...
for (auto& it : mapthings) {
fout << it.second.stringify();
}
我也使用相同的mapthings
但使用find()
函数:
return (mapthings.find(name))->second;
答案 0 :(得分:2)
因为find返回mapthings :: iterator,它存储指向mapthings :: value_type的指针。 而汽车和它是mapthings :: value_type的对象。
答案 1 :(得分:2)
在第一个示例中,基于范围的for循环直接给出了对象。所以你可以使用.
。
在第二个示例中,find
为您提供了对象的迭代器。这迫使你使用->
因为你需要对象本身。
答案 2 :(得分:1)
使用此代码时,您将获得对包含数据的std :: pair的引用
for (auto& it : mapthings) {
fout << it.second.stringify();
}
在第二个例子中,find返回一个需要被解除引用才能被读取的迭代器
答案 3 :(得分:1)
在第一个中,您获得std::map::value_type&
,其定义为std::pair<const Key, T>
。此方法最适合访问地图的所有成员。
在第二个中,你得到一个std::map::iterator
。 std::map::iterator
已重载operator->
,返回std::map::value_type*
。此方法最适合find
,upper_bound
,lower_bound
等,因为您在地图上执行查询。地图可能不包含与查询中使用的key
对应的成员。
答案 4 :(得分:1)
在此代码段中
std::map<std::string, aclass> mapthings;
...
for (auto& it : mapthings) {
fout << it.second.stringify();
}
it
的type_type类型为std::map<std::string, aclass>
,对应于类型
std::pair<const std::string, aclass>
因此,要访问此类对象的成员,必须使用operator。
在此代码段中
return (mapthings.find(name))->second;
方法find
返回指向映射的目标记录或end()
返回的迭代器的迭代器。迭代器就像指针一样。所以你需要使用operator - &gt;访问指向对象的成员。
考虑到你可以写更简单的
return mapthings.find( name )->second;
或
return ( *mapthings.find( name ) ).second;