iterator.h.xml 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <chapter xml:id="iterator.h">
  2. <title><tt>__vic/iterator.h</tt></title>
  3. <p>Инструменты работы с итераторами.</p>
  4. <chapter xml:id="begin-array">
  5. <title><tt>begin(T[])</tt>, <tt>end(T[])</tt>, <tt>cbegin(T[])</tt>,
  6. <tt>cend(T[])</tt></title>
  7. <code-block lang="C++"><![CDATA[
  8. template<class T, size_t N> constexpr T *begin(T (&arr)[N]);
  9. template<class T, size_t N> constexpr T *end(T (&arr)[N]);
  10. template<class T, size_t N> constexpr const T *cbegin(T (&arr)[N]);
  11. template<class T, size_t N> constexpr const T *cend(T (&arr)[N]);
  12. ]]></code-block>
  13. <p>Возвращают указатели на начало и за конец массива.</p>
  14. <section><title>Пример</title>
  15. <code-block lang="C++"><![CDATA[
  16. int vals[] = { 1, 2, 3 };
  17. std::list<int> lst(__vic::begin(vals), __vic::end(vals));
  18. assert(lst.size() == 3);
  19. ]]></code-block>
  20. </section>
  21. </chapter>
  22. <chapter xml:id="advance">
  23. <title><tt>advance()</tt></title>
  24. <code-block lang="C++"><![CDATA[
  25. template<class Iter>
  26. void advance(Iter &it, Iter end, size_t n);
  27. ]]></code-block>
  28. <p>Функция похожа на <tt>std::advance()</tt>, но отличается по формату вызова
  29. и поведению. Главные отличия:</p>
  30. <list style="numbered">
  31. <item>Позволяет двигаться только вперёд (<tt>++</tt>),</item>
  32. <item>Контролирует выход за границу диапазона. Прекращает работу, если
  33. достигнут <tt>end</tt>.</item>
  34. </list>
  35. </chapter>
  36. <chapter xml:id="next">
  37. <title><tt>next()</tt>, <tt>prev()</tt></title>
  38. <code-block lang="C++"><![CDATA[
  39. template<class ForwardIterator>
  40. ForwardIterator next(ForwardIterator it);
  41. template<class ForwardIterator>
  42. ForwardIterator next(ForwardIterator it, size_t n);
  43. template<class BidirectionalIterator>
  44. BidirectionalIterator prev(BidirectionalIterator it);
  45. template<class BidirectionalIterator>
  46. BidirectionalIterator prev(BidirectionalIterator it, size_t n);
  47. ]]></code-block>
  48. <p><tt>next()</tt> возвращает значение итератора, передвинутое вперёд на
  49. <tt>n</tt> позиций. <tt>prev()</tt> делает то же самое, но в противоположную
  50. сторону. В отличие от одноимённых функций из STL C++11, смещение не может быть
  51. отрицательным. Версии с одним параметром просто вызывают
  52. <tt>++it</tt>/<tt>--it</tt> и возвращают результат.</p>
  53. <section><title>Пример</title>
  54. <code-block lang="C++"><![CDATA[
  55. template<class Container>
  56. void f(const Container &c)
  57. {
  58. // Начать обход со второго элемента
  59. // v.begin() + 1 работает только для RandomAccessIterator
  60. // ++v.begin() может вообще не скомпилироваться
  61. for(auto it = __vic::next(c.begin()); it != c.end(); ++it) ...;
  62. }
  63. ]]></code-block>
  64. </section>
  65. </chapter>
  66. </chapter>