将随机访问迭代器的和表示为随机访问迭代器



随机访问迭代器被限制为两个迭代器之间的差异,或者从迭代器中添加或减去一个整数。规则不允许添加两个迭代器。

我偶然发现添加两个迭代器实际上是有用的:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;            using std::endl;
template<typename RndIterator> 
RndIterator rndIteratorsSum(RndIterator left, RndIterator right)
{
//return (left + right) / 2;        // forbidden
return left + (right - left) / 2;   // workaround
}

指针的和已经被减少为指针+的和(std::ptrdiff_t/int=int(,所以它现在是合法的。测试功能可以是:

int main()
{
// outputs median of input
vector<int> test = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int>::iterator iter = rndIteratorsSum(test.begin(), test.end());

cout << "median of input vector: " << *iter << endl;
return 0;
}

是允许还是不鼓励使用上述技巧?如果气馁,为什么?

您要求允许(left + right) / 2作为left + (right - left) / 2的较短表示法,因为这些表达式在数学中等同于数字。然而,要做到这一点,您需要定义2个迭代器的加法和迭代器除以一个数字。这两项行动本身似乎都没有意义。

根据LegacyRandomAccessIterator规范,迭代器ab:

  • a + b未定义
  • a - b产生difference_type,它是数值的(n(
  • a + n产生迭代器

因此:

  • a + (a - b)产生一个迭代器

如果difference_type支持除法(它应该支持除法(,那么您也可以执行a + (a - b) / 2

最新更新