ISO C++ 11 24.3:爲什麼std :: next不接受InputIterator?
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
);
爲什麼std::next
不接受InputIterator
S'
一個合法使用的情況下,我想的是:
first = find(next(first, x), last, 11); // ...
我已經找到合適的DR:
next
/prev
回報遞增的迭代器在不改變原有迭代器的值。但是,即使這可能會使InputIterator
無效。需要ForwardIterator
以保證'多次通過'的財產。
但我不明白multipass/invalidation是如何與此相關的。使用相同的多通道/無效的推理,我們甚至可以禁止std::find
爲InputIterator
S:
template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
沒有什麼特別之處std::next
在比較std::find
或std::vector::insert(pos, first, last)
具有完全合法的用例InputIterator
小號
而且std::next(it, n)
可用於通用代碼,該代碼不僅在InputIterator
上運行。
除了'std :: advance'來更準確地傳達InputIterators的語義。我們已經在聊天 – sehe
這樣的代碼可以用於從'InputIterator'開始的所有迭代器上工作的泛型函數。我有興趣聽到客觀的原因。 –
在另一個筆記上。根據C++ 11的特性,不應該對所有這些進行徹底檢查。也許像InputIterator這樣的東西應該是可移動的,而不是可複製的,以強調我們不能真的需要不同的迭代器到同一個來源? (但是,它應該全部用*範圍等等來整理出來,或許是一次大的改革。) –