This repository was archived by the owner on Nov 9, 2017. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathadvance.html
More file actions
39 lines (39 loc) · 4.02 KB
/
advance.html
File metadata and controls
39 lines (39 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<title>advance</title>
<table class='sites-layout-name-one-column sites-layout-hbox' cellspacing='0'><tbody><tr><td class='sites-layout-tile sites-tile-name-content-1'><div dir='ltr'><div class='sites-codeblock sites-codesnippet-block'>
<div><font face='monospace' color='#000000'>
<div><div>namespace std {</div><div> template <class InputIterator, class Distance></div><div> void advance(InputIterator& i, Distance n);</div><div>}</div>
</div>
</font></div>
</div>
<h2><a name='TOC--'/>概要</h2>
<div><b>イテレータをn回進める。</b></div>
<h2><a name='TOC--1'/>要件</h2>
<div>双方向イテレータもしくはランダムアクセスイテレータの場合のみ、nが負数であることを許可する。
</div>
<h2><a name='TOC--2'/>効果</h2>
<div>イテレータへの参照iをn回進める(nが負数の場合は逆方向に進める)。
</div>
<h2><a name='TOC--3'/>戻り値</h2>
<div>なし
</div>
<h2><a name='TOC--4'/>計算量</h2>
<div>規格上の規定はないが、多くの実装では以下のようになっている。
</div><div>入力イテレータ、前方向イテレータ : n回のインクリメント</div><div>双方向イテレータ: n回のインクリメント、もしくはデクリメント</div><div>ランダムアクセスイテレータ: O(1)</div>
<h2><a name='TOC--5'/>例</h2>
<div class='sites-codeblock sites-codesnippet-block'>
<div><font face='monospace'><div style='color:rgb(0,0,0)'>#include <iostream></div><div style='color:rgb(0,0,0)'>#include <iterator></div><div style='color:rgb(0,0,0)'>#include <vector></div><div style='color:rgb(0,0,0)'><br/></div><div style='color:rgb(0,0,0)'>int main()</div><div style='color:rgb(0,0,0)'>{</div><div style='color:rgb(0,0,0)'> std::vector<int> v = {3, 1, 4, 2, 5};</div><div style='color:rgb(0,0,0)'><br/></div><div style='color:rgb(0,0,0)'> decltype(v)::iterator i = v.begin();</div><div><font color='#000000'> std::</font><font color='#ff0000'>advance</font><font color='#000000'>(i, 3); // イテレータiを3回進める</font></div><div style='color:rgb(0,0,0)'><br/></div><div style='color:rgb(0,0,0)'> std::cout << *i << std::endl;</div><div style='color:rgb(0,0,0)'>}</div>
</font></div>
</div>
<h3><a name='TOC--6'/>出力</h3>
<div class='sites-codeblock sites-codesnippet-block'>
<div><font face='monospace' color='#000000'>2</font></div></div><div><div>
</div>
<h2><a name='TOC--7'/>実装例</h2>
<div class='sites-codeblock sites-codesnippet-block'>
<div><font face='monospace' color='#000000'><div>// 入力イテレータ(or 前方向イテレータ)</div><div>template <class InputIterator, class Distance></div><div>void advance_impl(InputIterator& i, Distance n, std::input_iterator_tag)</div><div>{</div><div><div> assert(n >= 0);</div></div><div> for (; 0 < n; --n) { ++i; }</div><div>}</div><div><br/></div><div>// 双方向イテレータ</div><div>template <class BidirectionalIterator, class Distance></div><div>void advance_impl(BidirectionalIterator& i, Distance n, std::bidirectional_iterator_tag)</div><div>{</div><div> if (n > 0) {</div><div> for (; 0 < n; --n) { ++i; }</div><div> }</div><div> else {</div><div> for (; n < 0; ++n) { --i; }</div><div> }</div><div>}</div><div><br/></div><div>// ランダムアクセスイテレータ</div><div>template <class RandomAccessIterator, class Distance></div><div>void advance_impl(RandomAccessIterator& i, Distance n, std::random_access_iterator_tag)</div><div>{</div><div> i += n;</div><div>}</div><div><br/></div><div>template <class Iterator, class Distance></div><div>void advance(Iterator& i, Distance n)</div><div>{</div><div> advance_impl(i, n,</div><div> typename std::iterator_traits<Iterator>::iterator_category());</div><div> // イテレータのカテゴリごとに最適な実装を選択させる</div><div>}</div>
</font></div>
</div>
</div>
<h2><a name='TOC--8'/>参照</h2>
<div><br/>
</div></div></td></tr></tbody></table>