确定set迭代器的顺序

时间:2018-01-10 12:47:33

标签: c++ iterator set

我有两个迭代器(比如说it1it2)到同一个std::set<int>。它们是通过lower_boundupper_bound获得的,因此它们不能安全取消引用(它们可能等于end())。 是否有一种简单而安全的方式来告诉哪一个先行?

我可以拨打std::distance(it1, it2)std::distance(it2, it1),但这似乎没有帮助,因为如果it1 != it2则其中一个呼叫是UB。我可以测试*it1 < *it2,但前提是没有迭代器指向end()。最后,我可以首先测试结束迭代器,然后对值进行上述比较。

是否有一个优雅的解决方案,纯粹基于迭代器而不涉及值,即解除引用?我愿意使用高达c ++ 14并且可能会提升。

编辑(回复评论): 我使用一套因为我想要快速查找和插入,特别是比线性复杂度快得多。排序后的矢量可能是一种替代方案,它可以轻松解决问题,但插入和删除是线性时间操作。

1 个答案:

答案 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;
}