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.AForwardIterator需要保证"多通"属性.
但我不明白多通/失效是如何与此相关的.使用相同的多通道/无效的推理,我们甚至可以禁止std::find为InputIteratorS:
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
Run Code Online (Sandbox Code Playgroud)
没有什么特别之处std::next的比较std::find或std::vector::insert(pos, first, last)其中具有完全合法的使用情况InputIterator小号
此外,std::next(it, n)它可以用于通用代码,它不仅可以在InputIterators上运行.
实际上,输入迭代器无法有效复制,因为一旦输入迭代器递增,任何留下的副本都将失效.
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(及相关功能)类似的问题; 它们也会使指定的输入迭代器的任何副本无效.但委员会很可能发现问题不那么严重.