Iterator를 모른채로 여러 Vector, Map, Set 같은 컨테이너들을 공부하니까 함수들을 이해하는 부분에서 어려움을 겪었습니다.
오늘 Iterator에 대해서 공부해보고 앞에서 놓친 부분들까지 포스팅해보도록 하겠습니다.
Iterator
1) Iterator의 정의
STL에서 Iterator는 포인터와 비슷하게 동작합니다.
STL의 모든 컨테이너는 각각 반복자를 제공합니다. 이를 이용하여 컨테이너에 저장되어 있는 원소들을 참조할 수 있습니다. 그래서 각 컨테이너가 적절한 알고리즘(검색, 삭제, 복사 등)을 동작하는 것을 도와줍니다.
쉽게 이해하자면 컨테이너가 가지고 있는 원소에 접근할 때 사용하는 것이 iterator입니다.
2) Iterator의 종류
각 컨테이너가 제공하는 Iterator의 기능에 따라서 반복자의 종류를 나눌 수 있습니다.
1. input iterator : 현재 위치의 원소를 한 번만 읽을 수 있습니다.
ex) istream
2. output iterator : 현재 위치의 원소를 한 번만 쓸 수 있습니다.
ex) ostream
3. forward iterator : 입, 출력, 순방향 이동이 가능합니다.
4. bidirectional iterator : 입, 출력, 양방향 이동이 가능합니다.
ex) list, set, multiset, map, multimap
5. random access iterator : 입, 출력, 양방향 이동, +, -, >, < 등의 연산이 가능합니다.
ex) vector, deque
3) Iterator의 사용 예시
Vector, Map, Set 각각 Iterator를 사용해보겠습니다.
다만 맨 처음인 Vector의 경우에는 for문, while문, for-each문을 이용해서 같은 기능이지만 다양하게 사용 해보겠습니다.
1. Vector
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector <int> v;
//데이터 집어넣기
for (int i = 0; i < 10; i++)
v.push_back(i);
//iterator 생성
vector <int> ::iterator itr;
//1. for문 사용
cout << "for문 사용" << endl;
for (auto itr = v.begin(); itr != v.end(); ++itr)
cout << *itr << " ";
cout << endl;
//2. while문 사용
itr = v.begin();
cout << "while문 사용" << endl;
while (itr != v.end()) {
cout << *itr << " ";
++itr;
}
cout << endl;
//3. for-each문 사용
cout << "for-each문 사용" << endl;
for (auto& itr : v)
cout << itr << " ";
return 0;
}
1번의 for문과 2번의 while문은 C언어와 비슷한 구조라 쉽게 이해를 할 수 있었습니다.
하지만 3번은 for-each문에 익숙하지도 않고 &(레퍼런스)를 사용해서 이해하는데에 어려움을 겪었습니다.
auto에 대해서 이해하고 싶으시면 이 블로그를
https://blockdmask.tistory.com/384
[C++] auto 타입추론에 대해서
안녕하세요. BlockDMask 입니다. 오늘은 C++에서 아주 편리하게 사용될 수 있는 auto 키워드에 대해서 알아보려고 합니다. C++11 이후의 auto에 대해서 이야기 해볼것 입니다. C++에서 for 반복문에서 auto
blockdmask.tistory.com
레퍼런스에 대해서 이해하고 싶으시면 이 블로그를 참조하시면 좋을 것 같습니다.
https://blockdmask.tistory.com/151
[C++] 레퍼런스, Reference, 참조자
안녕하세요 BlockDMask 입니다. 오늘은 C++의 참조자(Reference)에 대해서 알아보도록 하겠습니다. 0. 레퍼런스(Reference)란? 참조자(Reference)는 변수에 "별명"을 붙인다고 합니다. 그 "별명"을 통해서 변
blockdmask.tistory.com
3번의 방법을 쓰면 레퍼런스이기 때문에 복사비용이 들지 않고, 직접 접근이 가능해지게 됩니다.
그래서 3번 방법을 계속 사용하도록 하겠습니다.
2. Map
#include <iostream>
#include <map>
using namespace std;
int main() {
map <int, char> m;
//데이터 집어넣기
for (int i = 0; i < 10; i++)
m.insert(make_pair(i, char(i+65)));
//iterator 생성
map <int, char> ::iterator itr;
//for-each문 사용
cout << "for-each문 사용" << endl;
for (auto& itr : m)
cout << "key : " << itr.first << " value : " << itr.second << endl;
cout << endl;
return 0;
}
3. Set
#include <iostream>
#include <set>
using namespace std;
int main() {
set <int> s;
//데이터 집어넣기
for (int i = 0; i < 10; i++)
s.insert(i);
set <int> ::iterator itr;
cout << "for-each문 사용" << endl;
for (auto& itr : s)
cout << itr << endl;
return 0;
}
4) const_iterator vs iterator
iterator가 가리키는 것을 수정할 필요가 없을때에는 항상 const_iterator를 사용하는 것이 바람직합니다.
위의 코드에서도 값을 단순히 출력만 했기 때문에 const_iterator를 사용하는 것이 맞았습니다.
이상으로 iterator에 대한 공부를 마치겠습니다.
'C++' 카테고리의 다른 글
C++ STL next_permutation (0) | 2022.03.24 |
---|---|
C++ STL lower_bound, upper_bound (0) | 2022.03.23 |
C++ STL Set (0) | 2022.03.22 |
C++ STL Map (0) | 2022.03.22 |
C++ STL Vector (0) | 2022.03.21 |