[英]why are these two ways of accessing parts of C++ map pairs different
当我收到一个错误消息,提示我使用时,我感到很困惑.
运算符从映射中访问一对值,因为当我在代码中的两个地方更改它时,我收到一个新错误,建议我在代码的第二个地方使用->
。 我听了那讨厌的编译器。 我为什么要这样?
这是我在做什么:
在基于for的范围内,我想要键-值对中的值,例如:
std::map<std::string, aclass> mapthings;
...
for (auto& it : mapthings) {
fout << it.second.stringify();
}
我也使用相同的mapthings
但使用find()
函数:
return (mapthings.find(name))->second;
因为find返回mapthings :: iterator,它存储了一个指向mapthings :: value_type的指针。 当auto&时,它是mapthings :: value_type的对象。
在第一个示例中,基于范围的for循环直接给出对象。 这样就可以使用了.
。 在第二个示例中, find
为您提供了对象的迭代器。 这迫使您使用->
因为您需要对象本身。
使用此代码时,您将获得对包含数据的std :: pair的引用
for (auto& it : mapthings) {
fout << it.second.stringify();
}
在第二个示例中,find返回一个迭代器,该迭代器需要取消引用才能读取
在第一个中,您将获得一个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
相对应的成员。
在此代码段中
std::map<std::string, aclass> mapthings;
...
for (auto& it : mapthings) {
fout << it.second.stringify();
}
it
是与类型对应的std::map<std::string, aclass>
value_type类型
std::pair<const std::string, aclass>
因此,要访问此类型对象的成员,必须使用operator。
在此代码段中
return (mapthings.find(name))->second;
find
方法返回指向地图目标记录或end()
返回的迭代器的迭代器。 迭代器就像指针。 因此,您需要使用operator->来访问指向对象的成员。
考虑到您可以写得更简单
return mapthings.find( name )->second;
要么
return ( *mapthings.find( name ) ).second;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.