我正在编写自己的C ++ STL地图容器实现。现在我正在尝试实现迭代器。它应该允许你执行类似iter-> first和iter-> second的操作,分别返回键/值,其中iter是一个对象而不是指针。我想知道我应该如何重载这个?这有点令人困惑,因为我不确定返回类型应该是什么;我认为它必须是成员第一/第二的对象。是否通常返回对包装器/接口对象的引用或类似的东西?
答案 0 :(得分:6)
如果您的意思是C ++标准库,那么value_type
的{{1}}就是map
。成对的成员有pair
和first
。在second
中取消引用迭代器会为您提供map
。
答案 1 :(得分:6)
是的,您需要一个代理来保存相关参考。
对于类型:标准库迭代器通常取消引用类型为value_type
的类型。对于map<K,V>
,值类型为std::pair<K, V>
(或更确切地说,pair<key_type, mapped_type>
),您可以从中获取first
/ second
接口。
(Stephan Lavavej的一个讲座解释了MSVC ++实现如何使用set
和map
的相同底层数据结构;唯一的区别是set::value_type
等于set::key_type
,虽然map::value_type
是pair<key_type, mapped_type>
。这样你可以通过一个简单的特征检查告诉两者,但是迭代器接口实际上是相同的。)
答案 2 :(得分:3)
标准地图的value_type为std::pair<const KeyType, MappedType>
。
为了实现正常的指针语义,operator*
返回一个引用,而operator->
返回一个指针。
//minimal example
#include <utility>
#include <cstdio>
struct It
{
std::pair<const int, int> pair;
std::pair<const int, int>* operator->() { return &pair; }
std::pair<const int, int>& operator*() { return pair; }
};
int main()
{
It it = {std::make_pair(10, 20) };
(*it).second = 30;
std::printf("%d %d\n", it->first, it->second);
}
答案 3 :(得分:2)
std::map<K,V>::iterator
遍历std::pair<K,V>
类型的对象。
答案 4 :(得分:1)
你的问题的答案是肯定的。您应该返回代理对象或对代理对象的引用以获得该行为。