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

时间:2014-11-11 04:27:24

标签: c++ for-loop map stdmap std-pair

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

这就是我在做的事情:

在基于for循环的范围内,我想要键值对中的值,这可以是示例:

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

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

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

5 个答案:

答案 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::iteratorstd::map::iterator已重载operator->,返回std::map::value_type*。此方法最适合findupper_boundlower_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;