반응형
반복자(iterator)
집합에서 요소 하나하나를 읽어오는 방법
- begin : 집합의 첫 번째 요소의 주소 반환
- end : 집합의 마지막 번째 다음 요소의 주소 반환
#include <list>
int main()
{
int x[10] = { 1,2,3,4,5,6,7,8,9,10 }; // 배열 선언
int* px = x; // 배열의 첫번째 요소를 가르키는 포인터 대입
++px; // 포인터 증가
std::cout << *px << std::endl; // 다음 배열의 값 출력
std::list<int> s = { 1,2,3,4,5,6,7,8,9,10 }; // 리스트 선언
std::list<int>::iterator p = s.begin(); // 리스트의 첫번째 요소를 가르키는 iterator 대입
// std::list<int>::iterator p; -> auto로 간소화 : auto p;
++p; // 이터레이터 증가
std::cout << *p << std::endl; // 다음 리스트의 값 출력
}
기능
- 멤버 함수 begin/end
- 일반 함수 begin/end(C++11 이상)
- 표준 배열까지 동일 코드로 사용 가능한 일반 함수 버전 사용을 권장
#include <iostream>
#include <vector>
#include <list>
int main()
{
std::list<int> s1 = { 1,2,3,4,5,6,7,8,9,10 }; // 리스트 선언
auto s1b = s1.begin(); // 첫번째 요소
auto s1e = s1.end(); // 마지막 다음 요소.
while (s1b != s1e) // 모든 요소 읽기
{
int n = *s1b;
++s1b;
}
std::vector<int> s2 = { 1,2,3,4,5,6,7,8,9,10 }; // vector 선언
auto s2b = s1.begin(); // 첫번째 요소
auto s2e = s1.end(); // 마지막 다음요소.
while (s2b != s2e) // 모든 요소 읽기
{
int n = *s2b;
++s2b;
}
int s3[] = { 1,2,3,4,5,6,7,8,9,10 }; // 배열 선언
auto s3b = std::begin(s3); // 첫번째 요소(일반 함수) C++11, 멤버보단 일반 함수 권장
auto s3e = std::end(s3); // 마지막 다음요소(일반 함수) C++11
}
전체 요소 접근 방법
- [] 연산자 사용 : vector, deque 사용 가능, list 사용 불가
- range fo 사용
- while 사용
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 1,2,3,4,5,6,7,8,9,10 };
// 1. [] 연산자, vector는 되지만 list는 안됨
for (int i = 0; i < v.size(); i++)
{
std::cout << v[i] << std::endl;
}
// 2. range for, 모든 집합 타입 가능
for (auto& n : v)
std::cout << n << std::endl;
// 3. 반복자 사용, 모든 집합 타입 가능
auto p1 = std::begin(v);
while (p1 != std::end(v))
{
std::cout << *p1 << std::endl;
++p1;
}
}
반복자의 장점
- 컨테이너의 내부 자료구조에 상관없이 동일한 방법으로 모든 요소를 접근 할 수 있음
- GoF's 디자인 패턴중 "iterator" 패턴 활용
#include <iostream>
#include <vector>
#include <list>
int main()
{
std::list<int> s = { 1,2,3,4,5 }; // 비순차 메모리 주소 알고리즘
std::vector<int> v = { 1,2,3,4,5 }; // 순차 메모리 주소 알고리즘
auto p1 = std::begin(s); // 자료구조 무관 동일 접근
auto p2 = std::begin(v); // 자료구조 무관 동일 접근
++p1;
++p2;
int n1 = *p1;
int n2 = *p2;
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ STL 정책(Policy Base) (0) | 2019.05.12 |
---|---|
C++ STL 알고리즘(Algorithm) (0) | 2019.05.12 |
C++ STL 컨테이너(Container) (0) | 2019.05.11 |
C++ STL(Standard Template Library) (0) | 2019.05.11 |
C++ 연산자 재정의 활용(String 클래스 만들기) (0) | 2019.05.11 |