过载操作员->;用于STL迭代器 我正在编写我自己的C++ STL映射容器的实现。现在我尝试实现迭代器。它应该允许您执行类似iter->first和iter->second的操作,分别返回键/值,其中iter是一个对象而不是指针。我想知道我该怎么处理这个?这有点混乱,因为我不确定返回类型应该是什么;我想它必须是一个有成员的对象。返回对包装器/接口对象或类似对象的引用是典型的吗?

过载操作员->;用于STL迭代器 我正在编写我自己的C++ STL映射容器的实现。现在我尝试实现迭代器。它应该允许您执行类似iter->first和iter->second的操作,分别返回键/值,其中iter是一个对象而不是指针。我想知道我该怎么处理这个?这有点混乱,因为我不确定返回类型应该是什么;我想它必须是一个有成员的对象。返回对包装器/接口对象或类似对象的引用是典型的吗?,c++,stl,map,iterator,g++,C++,Stl,Map,Iterator,G++,您的问题的答案是肯定的。您应该返回代理对象或对代理对象的引用以获得该行为。您的问题的答案是肯定的。您应该返回代理对象或引用代理对象以获得该行为。 < P>如果您真正是C++标准库,则 ValueSype类型> > >对/>代码>。一对有成员第一个和第二个。在 map 中取消迭代器给出了配对< /代码> .< /p> 如果你真正的是C++标准库,那么 ValueSype map < /C> >是配对< /代码>。一对有成员第一个和第二个。在映射中取消对迭代器的引用将为您提供一个对是的,您需

您的问题的答案是肯定的。您应该返回代理对象或对代理对象的引用以获得该行为。

您的问题的答案是肯定的。您应该返回代理对象或引用代理对象以获得该行为。

< P>如果您真正是C++标准库,则<代码> ValueSype类型> <代码> > <代码> >对/>代码>。一对有成员
第一个
第二个
。在<代码> map 中取消迭代器给出了<代码>配对< /代码> .< /p> 如果你真正的是C++标准库,那么<代码> ValueSype <代码> map < /C> >是<代码>配对< /代码>。一对有成员
第一个
第二个
。在
映射中取消对迭代器的引用
将为您提供一个

是的,您需要一个代理来保存相关引用

至于类型:标准库迭代器通常取消对
value\u类型
的引用。对于
map
,值类型是
std::pair
(或者更确切地说是
pair
),这是您从中获取
第一个
/
第二个
接口的位置


(Stephan Lavavej的一个讲座解释了MSVC++实现如何为
set
map
使用相同的底层数据结构;唯一的区别是
set::value_type
等于
set::key_type
,而
map::value_type
。这样你就可以用简单的特征检查,但迭代器接口实际上是相同的。)

是的,您需要一个代理来保存相关引用

至于类型:标准库迭代器通常会取消对
value\u类型
的引用。对于
map
,值类型是
std::pair
(或者更确切地说,
pair
),从中可以获得
第一个
/
第二个
接口


(Stephan Lavavej的一个讲座解释了MSVC++实现如何为
set
map
使用相同的底层数据结构;唯一的区别是
set::value_type
等于
set::key_type
,而
map::value_type
。这样你就可以用简单的特征检查,但迭代器接口实际上是相同的。)

std::map::iterator
迭代类型为
std::pair
std::map::iterator
迭代类型为
std::pair
标准映射的值类型为
std::pair

为了实现正常的指针语义,
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);
}
//最小示例
#包括
#包括
构造它
{
std::成对;
std::pair*运算符->(){return&pair;}
std::pair&运算符*(){return pair;}
};
int main()
{
It={std::make_pair(10,20)};
(*it)。秒=30;
std::printf(“%d%d\n”,it->first,it->second);
}

标准映射的值类型是
std::pair

为了实现正常的指针语义,
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);
}
//最小示例
#包括
#包括
构造它
{
std::成对;
std::pair*运算符->(){return&pair;}
std::pair&运算符*(){return pair;}
};
int main()
{
It={std::make_pair(10,20)};
(*it)。秒=30;
std::printf(“%d%d\n”,it->first,it->second);
}

即使提问者真的是指STL,
地图的
值类型
仍然是
-p@SteveJessop:我不能这么说,但如果是这样的话,那就太好了!即使提问者真的是指STL,
地图的
值类型
仍然是
-p@SteveJessop:我不能这么说,但如果是这样,那就太好了!