如何定义运算符<对于双向迭代器?

时间:2011-07-22 15:44:15

标签: c++ iterator operator-keyword bidirectional

如何定义operator<对于双向迭代器? (list :: iterator)

(我想使用list而不是vector。)

4 个答案:

答案 0 :(得分:7)

您不能直接执行此操作,但可以计算std::distance(x.begin(), it1)std::distance(x.begin(), it2)并进行比较。鉴于列表没有随机访问权限,您必须通过遍历整个列表来支付此类查询的价格。


编辑:如果两个迭代器都接近列表末尾,则执行效果不佳。如果你想获得更多的花哨,你可以写一些探索算法从两个迭代器向外移动:

[ .... <-- it1 --> .... <-- it2 --> .... ]

您基本上会为每个fwd1 / rev1fwd2 / rev2保留两份副本,然后递减rev*迭代器,直到您点击{ {1}}并推进x.begin()迭代器,直到您点击fwd*。如果你的迭代器对是均匀分布的,那么这可能具有更好的预期运行时间。

答案 1 :(得分:2)

不可能。您可能需要走到end,为此您需要知道list来源list::iterator

(你可以为此目的创建一个函数对象,它将list或origin作为构造函数参数。请注意,找出一个迭代器是否小于另一个迭代器需要O(n)时间。)

答案 2 :(得分:2)

您无法执行此操作,因为您必须知道列表的开头和/或结尾才能进行此类比较。只有随机访问迭代器定义operator<

答案 3 :(得分:1)

假设++(list.end())不是未定义的行为且等于list.end(),则有一种方法。但我不确定这个假设。

如果有效,您可以定义一个简单的算法来获得所需的结果。