본문 바로가기

Information Technology/C++

[C++] STL의 반복자 iterator

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)


iterator란, 우리가 vector나 map 등등을 이용하여 만든 컨테이너에 저장된 값을 모두 한 번씩 호출하거나 출력할 때 사용하는 반복자를 말합니다. 풀고 풀어서 반복 호출자? 정도로 말해도 될 것 같은데, 코드를 통해 설명하겠습니다.

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> container;
	for (int i = 0; i < 10; ++i)
		container.push_back(i);

	vector<int>::const_iterator itr;
	itr = container.begin();
	while (itr != container.end())
	{
		cout << *itr << " ";
		++itr;
	}
	cout << endl;

	return 0;
}

여기 vector, list, set, map 등 다양한 컨테이너 STL을 사용하는 코드가 있습니다.

main 함수에서 vector 컨테이너를 하나 만들고, push_back을 통해서 0부터 9까지의 값을 주었습니다.

그리고 vector클래스의 const_iterator라는 멤버를 호출하고 itr이라는 이름으로 초기화한 다음,

itr에 위에서 만든 container 벡터의 시작 주소를 줍니다.

그리고 밑에 있는 while문을 통해 itr이 container 벡터의 맨 마지막인 container.end()가 되기 전까지 실행한다는 조건을 주고,

cout을 통해 itr의 주소에 저장된 값을 호출하고 1을 더해 container 벡터의 다음 값으로 넘어가게 해주면 container 전체가 출력됩니다.

for (auto itr = container.begin(); itr != container.end(); ++itr)
{
	cout << *itr << " ";
}

while문이 아닌 for문을 통해서도 iterator를 사용할 수 있습니다.

위의 코드와 같이 for문의 조건을 선언할 때 auto를 사용해서 itr의 자료형 설정을 컴파일러에게 맡기고, 나머지는 while문과 유사하게 itr이 container.end()가 되기 전까지 실행하도록 해주면 while문보다 조금 더 짧은 코드로 iterator를 사용할 수 있습니다.

 

이렇게 일일이 iterator를 정의하고 값을 준 다음 호출하는 건 전통적인 방법이라고 합니다. 요즘엔 조금 더 편리?하게 for-each문을 사용하기도 합니다.

#include <iostream>
#include <map>
using namespace std;

int main()
{
	map<int, char> container;
	for (int i = 0; i < 10; ++i)
		container.insert(make_pair(i, char(i+65)));

	for (auto itr = container.begin(); itr != container.end(); ++itr)
	{
		cout << itr->first << " " << itr->second << endl;
	}
	cout << endl;

	return 0;
}

이번에는 vector가 아닌 map 컨테이너에 iterator를 사용해보겠습니다.

큰 구조는 사실 vector나 map이나 비슷합니다.

다만 map 컨테이너를 초기화 할 때는 vector의 push_back이 아닌 insert를 통해 값을 줍니다.

또한 key와 value값을 각각 줘야하기 떄문에 make_pair를 통해 map 컨테이너를 만들 때 정한대로 int값과 char값을 차례로 make_pair의 매개변수로 입력합니다.

이제 iterator를 이용하여 container에 저장된 값들을 호출합니다. 여기서도 역시 map은 vector와 구조가 다르기 때문에,

*itr을 통해 값을 호출하지 않고,

itr->first와 itr->second를 통해 key와 value를 각각 호출합니다.