C++ 如何在两个迭代器中间找到迭代器?

C++ 如何在两个迭代器中间找到迭代器?,c++,C++,我正在尝试将我的quicksort实现转换为一个模板,该模板可以与向量之外的其他容器一起使用 最初我使用索引查找中间索引,例如(first+last)/2。如何找到两个迭代器的中间位置?可以尽可能有效地测量两个迭代器之间的距离 可以尽可能有效地增加迭代器 但我仍然不想对链表进行快速排序:)使用: 及 像这样的怎么样 bool isMovingFirst = true; while(first != last) { if(isMovingFirst) { ++first; } e

我正在尝试将我的quicksort实现转换为一个模板,该模板可以与向量之外的其他容器一起使用

最初我使用索引查找中间索引,例如
(first+last)/2
。如何找到两个迭代器的中间位置?

可以尽可能有效地测量两个迭代器之间的距离

可以尽可能有效地增加迭代器

但我仍然不想对链表进行快速排序:)

使用:


像这样的怎么样

bool isMovingFirst = true;
while(first != last) {
  if(isMovingFirst) {
    ++first;
  } else {
    --last;
  }
  isMovingFirst = !isMovingFirst;
}

要查找中间迭代器,应使用:

first + (last - first) / 2

为什么不对链表进行快速排序?快速排序不需要找到中间值…@DietrichEpp:True,但有一个原因是
std::sort
特别需要随机访问迭代器。我确信这是技术原因,但与算法无关。对链表进行快速排序很容易,但不停地在链表上走来走去效率很低。您大部分时间都在访问“节点->下一个”和“节点->上一个”,几乎没有时间实际执行排序。性能方面,通过将数据复制到向量中并在那里进行排序,您可能会做得更好。顺便说一句,为什么要实现自己的快速排序?排序应该包括快速排序,还有稳定排序、部分排序、复制等。我正在做Euler项目,想研究一些排序算法,不过如果我计划将来重用它,你说得对——我也可以使用std::sort。重新实现标准库中的东西通常被认为是不好的形式。不要重复你自己的话。哦,我完全同意。我之所以写它,是因为它的步数与距离相同(没有调用advance)。但是相对于快速排序的O(n logn)时间复杂度而言,距离+前进的成本仍然很低,所以我肯定你的观点在这种情况下是有效的。好吧,如果我们要提高效率,你就有一个你不需要的额外成本。。。请尝试以下方法:对于(;){if(first==last)break;++first;if(first==last)break;--last;}这是不正确的。您的解决方案需要随机访问迭代器。OP要求提供一个独立于容器的解决方案。