将随机访问迭代器的总和表示为随机访问迭代器
Represent sum of random access iterators as a random access iterator
随机访问迭代器被限制为两个迭代器之间的差异,或者从迭代器中添加或减去一个整数。
规则不允许添加两个迭代器。
我偶然发现添加两个迭代器实际上很有用的情况:
#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;
}
允许还是不鼓励使用上述技巧?如果气馁,为什么?
根据 LegacyRandomAccessIterator 规范,迭代器 a
和 b
:
a + b
未定义。
a - b
产生 difference_type
,这是数值 (n
)
a + n
产生一个迭代器
因此:
a + (a - b)
产生一个迭代器
如果difference_type
支持除法,它应该支持,那么你也可以a + (a - b) / 2
。
您要求允许 (left + right) / 2
作为 left + (right - left) / 2
的缩写,因为这些表达式等同于数学中的数字。但是,要做到这一点,您需要定义 2 个迭代器的加法和迭代器除以一个数字。这些操作本身似乎都没有意义。
随机访问迭代器被限制为两个迭代器之间的差异,或者从迭代器中添加或减去一个整数。 规则不允许添加两个迭代器。
我偶然发现添加两个迭代器实际上很有用的情况:
#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;
}
允许还是不鼓励使用上述技巧?如果气馁,为什么?
根据 LegacyRandomAccessIterator 规范,迭代器 a
和 b
:
a + b
未定义。a - b
产生difference_type
,这是数值 (n
)a + n
产生一个迭代器
因此:
a + (a - b)
产生一个迭代器
如果difference_type
支持除法,它应该支持,那么你也可以a + (a - b) / 2
。
您要求允许 (left + right) / 2
作为 left + (right - left) / 2
的缩写,因为这些表达式等同于数学中的数字。但是,要做到这一点,您需要定义 2 个迭代器的加法和迭代器除以一个数字。这些操作本身似乎都没有意义。