繁体   English   中英

为什么这两种访问C ++映射对部分的方式不同

[英]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* 此方法最适合findupper_boundlower_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM