为什么这两种访问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::迭代器,它存储指向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::iterator
。std::map::iterator
使operator->
过载,返回一个std::map::value_type*
。此方法最适用于find
、upper_bound
、lower_bound
等,因为您在地图上执行查询。映射可能不包含与查询中使用的key
相对应的成员。
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如何以优化的方式同时迭代两个间距不相等的数组
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 准确了解对象在内存中的映射方式
- 为什么 c++ 映射值不针对同一键更新?
- 类中的C++映射不会保存新键
- C++映射不删除元素
- tao_idl -Gstl 不映射 std::string
- 映射迭代器与运算符不匹配
- 日食快捷方式不起作用
- 我插入 STL 映射的方式是否正确?不会漏内存吗?
- 编辑控件的行为方式不该如此
- 运算符 [] 和 insert() 函数在 C++ 映射中的行为方式不应该相同吗?
- QTextEdit focusOut 以编程方式不起作用
- 多重XOpenDisplay(NULL)导致不映射窗口
- cocos2d- x3创建标签的方式不被弃用
- 如何编译我的c++库在纯Android Studio的方式(不指定任何.mk文件在我们自己)
- 以与数组相同的方式在映射上循环
- 我可以以某种方式不写出完整的限定返回类型名称吗?