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

时间:2020-10-30 22:42:34

标签: c++ templates iterator pointer-arithmetic

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

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

#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;
}

是否允许或不鼓励使用上述技巧?如果不鼓励,为什么?

2 个答案:

答案 0 :(得分:2)

您要允许(left + right) / 2作为left + (right - left) / 2的缩写,因为这些表达式与数学中的数字等效。但是,为此,您需要定义2个迭代器的加法和将迭代器除以一个数字。这些操作似乎都没有意义。

答案 1 :(得分:1)

根据LegacyRandomAccessIterator规范,您可以拥有迭代器ab

  • a + b未定义。
  • a - b产生difference_type,它是数字(n
  • a + n产生一个迭代器

因此:

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

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