在C ++中实现类似映射的迭代器时的问题

时间:2010-11-16 19:15:24

标签: c++ iterator

我刚刚完成在C ++中实现一个通用的跳过列表,我想把它带来 STL类地图迭代器。 重载“ - >”时出现问题operator:需要返回对iterator :: value_type的引用,在我的例子中是std :: pair,其中K是键类型,V是类似map的容器的值类型。 代码如下:

value_type& operator->() { return value_type(inner->key, inner->value); }

编译器返回一些关于临时对象引用的仇恨消息,而我 完全同意他的意见;我的问题是:我该怎么做才能返回参考资料 一对而不必在我的迭代器类中放置一对成员?

4 个答案:

答案 0 :(得分:2)

value_type& operator->() { return value_type(inner->key, inner->value); }

您的返回类型是对value_type的引用,但是您返回一个本地创建的实例,该实例将在函数/运算符范围的末尾被销毁(即结束}。)所以你返回一个垃圾引用,这就是你的编译器讨厌你的原因。

如果您改为按值返回,您将拥有正确且功能正常的代码。 (您是否按值返回取决于value_type的类型。)

value_type operator->() { return value_type(inner->key, inner->value); }

更好的方法是将单个value_type维护为班级的成员字段,但是你说你不想这样做,所以这是唯一的其他现实选择。

答案 1 :(得分:2)

首先,operator->应该返回一个指针,或者其他具有自己的operator->()方法的东西。但是,如果您没有value_type,即存储pair<const K,V>,则无法轻松返回指针。

您可以更改inner的定义,使其成为或包含pair吗?您可以添加key()value()等访问者,以避免在大多数地方混淆firstsecond

或者,根据您需要采取此行动的std::map多少,也许您应该使用不同的value_type typedef来描述您实际拥有的内容。

答案 2 :(得分:0)

你在snipped中正在做的是创建一个value_type的新实例。当一个函数/方法operator-&gt;()离开时,这个对象当然会被删除,这使你刚刚返回的引用指向无处。

您应该做的是返回对列表中已有的相应元素的引用。

答案 3 :(得分:0)

operator-&gt;()应仅返回指针值或为其定义的重载operator-&gt;()函数。这个功能的重点不在于执行' - &gt;'操作本身,但提供' - &gt;'的对象或指针操作员将继续操作。

在您的情况下,要完成此操作,您需要返回指向pair的指针。如果你真的想避免将这对存储在你的类中,你可以让函数返回一个指向新分配对的智能指针,这样就不会在操作期间发生内存泄漏。