<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=EffectiveSTL%2FIterator</id>
	<title>EffectiveSTL/Iterator - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=EffectiveSTL%2FIterator"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=EffectiveSTL/Iterator&amp;action=history"/>
	<updated>2026-05-15T01:37:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=EffectiveSTL/Iterator&amp;diff=31491&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=EffectiveSTL/Iterator&amp;diff=31491&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;* 반복자는 STL을 이해하는데에 필수적인 개념이다.&lt;br /&gt;
* STL이 제공하는 반복자는 4가지다. (iterator, const_iterator, reverse_iterator, const_reverse_iterator)&lt;br /&gt;
* 이 큰장에서는 각 반복자들의 특성과, 반복자를 효율적으로 쓰는 방법을 다룰 것이다.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Item26. Prefer iterator to const_iterator, reverse_iterator, and const_reverst_iterator. =&lt;br /&gt;
== 각각의 반복자가 의미하는 것 ==&lt;br /&gt;
* container&amp;amp;lt;T&amp;amp;gt;::iterator, reverse_iterator : T*&lt;br /&gt;
* container&amp;amp;lt;T&amp;amp;gt;::const_iterator, const_reverse_iterator : const T*&lt;br /&gt;
* reverse는 뒤에서부터 앞으로 순회함. 아닌건 앞에서부터 뒤로&lt;br /&gt;
&lt;br /&gt;
== iterator를 써야하는 이유 ==&lt;br /&gt;
* 대부분의 메소드들의 인자가 iterator타입이다.&lt;br /&gt;
* 다른 iterator로부터 iterator로 암시적인 변환이 가능하다.&lt;br /&gt;
&lt;br /&gt;
== 결론 ==&lt;br /&gt;
* 이런 혼잡함을 겪고 싶지 않다면 그냥 딴거 쓰지 말고 iterator 쓰자는 것이다.&lt;br /&gt;
* 내 해석이 잘못되지 않았다면, const_iterator는 말썽의 소지가 있는 넘이라고까지 표현하고 있다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Item27. Use distance and advance to convert a container&amp;#039;s const_iterators to iterators. =&lt;br /&gt;
== 서론 ==&lt;br /&gt;
* const_iterator는 될수 있으면 쓰지 말라고 했지만, 어쩔수 없이 써야할 경우가 있다.&lt;br /&gt;
* 그래서 이번 Item에서는 const_iterator -&amp;gt; iterator로 변환하는 법을 설명하고 있다. 반대의 경우는 암시적인 변환이 가능하지만, 이건 안된다.&lt;br /&gt;
* 다음엔 C++의 casting에 관한 무슨 함축적인 의미가 담긴 말을 하고 있는데.. 아시는분은 좀 가르쳐 주세요. 이런생각을 가지고 있는것에 대해 부끄러워 하라네요.&lt;br /&gt;
** 원문 : &amp;#039;&amp;#039;&amp;#039;&amp;quot;When all else fails, get a bigger hammer.&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== 잘못된 방법들 ==&lt;br /&gt;
 // iterator와 const_iterator를 각각 Iter, CIter로 typedef해놓았다고 하자.&lt;br /&gt;
 CIter ci;&lt;br /&gt;
 ...&lt;br /&gt;
 Iter i(ci);       // 안된다. 암시적인 형변환은 성립하지 않는다.&lt;br /&gt;
 ...&lt;br /&gt;
 Iter i( const_cast&amp;amp;lt;Iter&amp;amp;gt;(ci) )       // 역시 안된다. vector와 string에서는 될지도 모르지만... 별루 추천하지는 않는것 같다.&lt;br /&gt;
* 밑에께 안되는 이유는 iterator와 const_iterator는 다른 클래스이다. 상속관계도 아닌 클래스가 형변환 될리가 없다.&lt;br /&gt;
* string, vector가 될수도 있는 이유&lt;br /&gt;
** vector&amp;amp;lt;T&amp;amp;gt;::iterator는 T*의 typedef, vector&amp;amp;lt;T&amp;amp;gt;::const_iterator는 const T*의 typedef이다. (클래스가 아니다.)&lt;br /&gt;
** string::iterator는 char*의 typedef, string::const_iterator는 const char*의 typedef이다. 따라서 const_cast&amp;lt;&amp;gt;가 통한다. (역시 클래스가 아니다.)&lt;br /&gt;
* 하지만 reverse_iterator와 const_reverse_iterator는 typedef이 아닌 클래스이다. const_cast&amp;lt;안된다&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 해결책 ==&lt;br /&gt;
 Iter i(d.begin());    // d는 어떤 컨테이너의 인스턴스다.&lt;br /&gt;
 advance(i, distance(i,ci));        // 요렇게 하면 된다.... 인줄 알았는데 밑에 또 안된다고 써있다--;&lt;br /&gt;
* 왜 안되냐면, distance의 인자는 둘자 iterator다. const_iterator가 아니다. &lt;br /&gt;
 advance(i, distance&amp;amp;lt;CIter&amp;amp;gt;(i,ci));     // 이렇게 하면 진짜 된다.&lt;br /&gt;
&lt;br /&gt;
== 잡담 ==&lt;br /&gt;
* 정말 별걸 다 설명한다는 생각이 든다. 모르고 있었으면 안쓸 것들도, 괜히 들쑤셔 내서 이거 쓰지 말아라 하니 오히려 더 헷갈린다는--;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Item28. Understand how to use a reverse_iterator&amp;#039;s base iterator =&lt;br /&gt;
== 예제 ==&lt;br /&gt;
 vector&amp;amp;lt;int&amp;amp;gt; v;   &lt;br /&gt;
 ...             // v에 차례대로 1~5까지 집어넣는다.&lt;br /&gt;
 &lt;br /&gt;
 typedef vector&amp;amp;lt;int&amp;amp;gt;::reverse_iterator VIRI;&lt;br /&gt;
 VIRI ri = find(v.rbegin(), v.rend(), 3);       // 거꾸로 순회하면서 3을 찾는다.&lt;br /&gt;
 &lt;br /&gt;
 typedef vector&amp;amp;lt;int&amp;amp;gt;::iterator VIIT;&lt;br /&gt;
 VIIT i(ri.base());                             // 앞에서도 말했지만 reverse 시리즈의 base()메소드를 호출해주면 그냥 시리즈로 바뀐 반복자를 리턴해준다.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| rend()&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ri&lt;br /&gt;
| &lt;br /&gt;
| rbegin()&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| begin()&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| i&lt;br /&gt;
| &lt;br /&gt;
| end()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 어째 그림이 좀 이상하긴 한데..--; 각각의 반복자가 가르키는 위치를 나타낸 것이다. 보면 알겠지만 ri에서 base()를 호출해줬는데도 가르키는게 같지가 않다.&lt;br /&gt;
* 결론부터 말하자면, base()메소드가 원하는 반복자를 리턴해주는건 아니다. 삽입할떄는 되지만, 원소를 지울때는 꼬인다.&lt;br /&gt;
&lt;br /&gt;
* 만약에 ri가 가르키는 위치에다 새로운 원소를 삽입하고 싶다고 하자. 하지만 insert 메소드는 reverse_iterator는 인자로 받지 않는다. iterator형만 인자로 받는다. 즉 직접은 못한다는 것이다. 지울때도 이와 같은 문제가 발생한다. 그래서 base()를 쓰는 것이다.&lt;br /&gt;
&lt;br /&gt;
* 99를 i가 가르키는 위치에 삽입했다고 하면(reverse시리즈는 인자로 못 넣는다.) 이렇게 될 것이다.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
| 99&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* 삽입은 문제없이 되었지만.. 만약에 erase()를 호출한다면? 난 3을 지우고 싶은데 base()호출해서 iterator버젼으로 넣어주면 4가 날아갈 것이다. 어떻게 해야하는가?&lt;br /&gt;
* 해결책은&lt;br /&gt;
 v.erase( (++ri).base() );    // 끝. 이러면 ri는 2를 가르키게 되고 base() 호출후 리턴되는 반복자는 3을 가르킨다. 그걸 지우면 된다.&lt;br /&gt;
&lt;br /&gt;
== 잡담 ==&lt;br /&gt;
* 그냥 iterator만 쓰자..--;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
= Item29. Consider istreambuf_iterators for character-by-characer input. =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[[EffectiveSTL]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>