반복자 iterator란?
컨테이너를 순회하는 방법
반복자는 객체이다.
iterator 순회 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
|
void main()
{
vector<int> vecint;
vecint.push_back(10);
vecint.push_back(20);
vecint.push_back(30);
vector<int>::iterator iter_begin = vecint.begin();
vector<int>::iterator iter_end = vecint.end();
for (; iter_begin != iter_end; iter_begin++)
{
cout << *iter_begin << endl;
}
}
|
cs |
9행 : vector<int>을 순회하는 반복자 iterator를 선언하고 vector의 첫 번째를 가리키는 반복자를 반환한다.
10행 : vector의 마지막 다음의 주소를 반환한다.
12,15행 : 반복자를 이용한 vector 순회
순회시 문제 반복자의무효화
반복자를 사용하여 순회할 때 중간에 값을 삭제하거나 추가하여 시작 위치와 끝 위치가 달라지면 반복자의 문제가 생긴다.
1. 반복자를 들어가기 전에 end를 지정하고 반복을 하던 중에 만약 값의 추가가 생겼다면 끝의 위치는 바뀌게 된다.
근데 이때 end의 위치를 수정하지 않으면 컴파일 에러가 출력된다.
2. 추가할 때 vector의 값을 추가할 때 메모리가 가득 차 새로운 동적할당이 되면 시작 지점과 끝 지점의 반복자가 변경되는데 이때도 새로 재할당을 해주지 않으면 컴파일 에러가 출력된다.
1.번 문제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
|
void main()
{
vector<int> vecint;
vecint.push_back(10);
vecint.push_back(20);
vecint.push_back(30);
vector<int>::iterator iter_begin = vecint.begin();
vector<int>::iterator iter_end = vecint.end();
vecint.push_back(40);
for (; iter_begin != iter_end; iter_begin++)
{
cout << *iter_begin << endl;
}
}
|
cs |
2번 문제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
|
void main()
{
vector<int> vecint;
vecint.reserve(4);
vecint.push_back(10);
vecint.push_back(20);
vecint.push_back(30);
vecint.push_back(40);
vector<int>::iterator iter_begin = vecint.begin();
vecint.push_back(50);
for (; iter_begin != vecint.end(); iter_begin++)
{
cout << *iter_begin << endl;
}
}
|
cs |
값이 없는 컨테이너의 반복자
아무런 값이 존재하지 않는컨테이너의 being과 end는 같은곳을 바라보게된다.
1
2
3
4
5
6
7
8
9
10
11
12
|
|
void main()
{
vector<int> vecint;
vector<int>::iterator iter_begin = vecint.begin();
vector<int>::iterator iter_end = vecint.end();
if (iter_begin == iter_end)
{
cout << "같다" << endl;
}
}
|
cs |
'C++' 카테고리의 다른 글
C++ STL(Map) (0) | 2020.10.06 |
---|---|
C++ STL(알고리즘) (0) | 2020.09.28 |
C++ STL(Vector) (0) | 2020.09.28 |
C++ 템플릿(template) (0) | 2020.09.24 |
C++ 함수객체 (0) | 2020.09.23 |