如何定义operator<对于双向迭代器? (list :: iterator)
(我想使用list而不是vector。)
答案 0 :(得分:7)
您不能直接执行此操作,但可以计算std::distance(x.begin(), it1)
和std::distance(x.begin(), it2)
并进行比较。鉴于列表没有随机访问权限,您必须通过遍历整个列表来支付此类查询的价格。
编辑:如果两个迭代器都接近列表末尾,则执行效果不佳。如果你想获得更多的花哨,你可以写一些探索算法从两个迭代器向外移动:
[ .... <-- it1 --> .... <-- it2 --> .... ]
您基本上会为每个fwd1
/ rev1
和fwd2
/ 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()
,则有一种方法。但我不确定这个假设。
如果有效,您可以定义一个简单的算法来获得所需的结果。