c++ - 将随机访问迭代器的总和表示为随机访问迭代器

标签 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;
}

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

最佳答案

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

关于c++ - 将随机访问迭代器的总和表示为随机访问迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64616665/

相关文章:

c++ - 编译简单的boost spirit语法

c++ - 奇怪的包含依赖

templates - 使用 mixin 时有关覆盖方法的警告

java - 迭代器堆栈 hasNext() 不返回 true

C++ std::reduce 与数组

java - D 是 Java 和 C++ 的可靠替代品吗?

C++ : How can I solve a first-chance exception caused at an unknown point?

c++ - 使用可变函数作为模板参数

c++ - 如何使用重载函数作为函数模板的参数?

c++ - 迭代器不会遍历整个 map