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

why are these two ways of accessing parts of C++ map pairs different

本文关键字:方式不 映射 两种 访问 C++ 为什么      更新时间:2023-10-16

当我收到一个错误,建议我使用.运算符从映射中访问一对中的值时,我感到困惑,因为当我在代码中的两个位置更改它时,我收到了一个新的错误,建议在代码的第二个位置使用->。我听了冗长的编译器的话。为什么我需要?

我在做什么:

在基于范围的for循环中,我想要键值对中的值,例如:

std::map<std::string, aclass> mapthings;
...
for (auto& it : mapthings) {
    fout << it.second.stringify();
}

我也使用相同的mapthings,但使用find()函数:

return (mapthings.find(name))->second;

因为find返回mapthings::迭代器,它存储指向mapthings::value_type的指针。而auto&它是mapthings::value_type的对象。

在第一个例子中,基于范围的for循环直接给出对象。所以您可以使用.。在第二个示例中,find为您提供了对象的迭代器。这迫使您使用->,因为您需要对象本身。

在这个代码片段中

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>

所以要访问这种类型的对象的成员,必须使用运算符。

在这个代码片段

return (mapthings.find(name))->second;

方法CCD_ 10返回迭代器,该迭代器指向映射的目标记录或CCD_。迭代程序就像指针。因此,您需要使用操作符->来访问指向对象的成员。

考虑到你可以写更简单的

return mapthings.find( name )->second;

return ( *mapthings.find( name ) ).second;

当您使用此代码时,您将获得对包含数据的std::对的引用

for (auto& it : mapthings) {
    fout << it.second.stringify();
}

在第二个示例中,find返回一个迭代器,该迭代器需要解引用才能读取

在第一个中,您得到一个std::map::value_type&,它被定义为std::pair<const Key, T>。此方法最适合访问地图的所有成员。

在第二个例子中,你得到了一个std::map::iteratorstd::map::iterator使operator->过载,返回一个std::map::value_type*。此方法最适用于findupper_boundlower_bound等,因为您在地图上执行查询。映射可能不包含与查询中使用的key相对应的成员。