我有两个迭代器(比如说it1
和it2
)到同一个std::set<int>
。它们是通过lower_bound
和upper_bound
获得的,因此它们不能安全取消引用(它们可能等于end()
)。
是否有一种简单而安全的方式来告诉哪一个先行?
我可以拨打std::distance(it1, it2)
和std::distance(it2, it1)
,但这似乎没有帮助,因为如果it1 != it2
则其中一个呼叫是UB。我可以测试*it1 < *it2
,但前提是没有迭代器指向end()
。最后,我可以首先测试结束迭代器,然后对值进行上述比较。
是否有一个优雅的解决方案,纯粹基于迭代器而不涉及值,即解除引用?我愿意使用高达c ++ 14并且可能会提升。
编辑(回复评论): 我使用一套因为我想要快速查找和插入,特别是比线性复杂度快得多。排序后的矢量可能是一种替代方案,它可以轻松解决问题,但插入和删除是线性时间操作。
答案 0 :(得分:3)
在我看来,最好的方法是修复代码逻辑,让[it1,it2)
始终是有效范围;如果事实证明这是不可能的(但它怎么可能?),你可以使用像
// O(N), forward iterators, it1, it2 should belong to range
template<class Iter>
bool precedes_or_is_equal( Iter it1, Iter it2, Iter end )
{
while( it1 != end && it1 != it2 ) ++it1;
return it1 == it2;
}