为什么std :: next不接受InputIterator?

Evg*_*yuk 4 c++ stl c++11

ISO C++ 11 24.3:

template <class InputIterator, class Distance>
void advance(InputIterator& i, Distance n);
// ...
template <class ForwardIterator>
ForwardIterator next
(
    ForwardIterator x,
    typename std::iterator_traits<ForwardIterator>::difference_type n = 1
);
Run Code Online (Sandbox Code Playgroud)

为什么std::next不接受InputIterator

我正在考虑的一个合法用例是:

first = find(next(first, x), last, 11); // ...
Run Code Online (Sandbox Code Playgroud)

我找到了合适的DR:

next/ prev返回递增的迭代器而不更改原始迭代器的值.但是,即使这样也可能使a无效InputIterator.A ForwardIterator需要保证"多通"属性.

但我不明白多通/失效是如何与此相关的.使用相同的多通道/无效的推理,我们甚至可以禁止std::findInputIteratorS:

template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
Run Code Online (Sandbox Code Playgroud)

没有什么特别之处std::next的比较std::findstd::vector::insert(pos, first, last)其中具有完全合法的使用情况InputIterator小号

此外,std::next(it, n)它可以用于通用代码,它不仅可以在InputIterators上运行.

ric*_*ici 8

实际上,输入迭代器无法有效复制,因为一旦输入迭代器递增,任何留下的副本都将失效.

std::next接受一个迭代器并返回另一个已经过了高级n时间的迭代器.你不能使用输入迭代器来做到这一点而不会使原始迭代器失效,这是std::next毫无意义的.通过约束,std::advance提前指定的迭代器n时间,这对于输入迭代器来说很好.

std::next是迭代器的泛化operator+(T*, size_t).std::advance是迭代器的泛化operator+=(T*&, size_t).它很可能是std::advance一样operator+=,应该返回一个参考,而不是空洞的.

确实存在与std::find(及相关功能)类似的问题; 它们也会使指定的输入迭代器的任何副本无效.但委员会很可能发现问题不那么严重.

  • @evgeny:你可以自由使用`advance(first,x); first = find(first,last,11);`.也许"毫无意义"并不是一个正确的词; 我的意思是假装可以返回不同的迭代器是没有意义的. (3认同)