如何解决将随机访问迭代器的和表示为随机访问迭代器
随机访问迭代器被限制为两个迭代器之间的差异,或者被限制为从迭代器中添加或减去一个整数。 规则不允许添加两个迭代器。
我偶然发现了添加两个迭代器实际上是有用的情况:
#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规范,您可以拥有迭代器a
和b
:
-
a + b
未定义。 -
a - b
产生difference_type
,它是数字(n
) -
a + n
产生一个迭代器
因此:
-
a + (a - b)
产生一个迭代器
如果difference_type
支持应该的除法,那么您也可以进行a + (a - b) / 2
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。