본문 바로가기
[C++] Data Structure & Algorithm/STL

[STL] vector #2

by song.ift 2023. 5. 15.

반복자(iterator) : pointer와 유사한 개념. 컨테이너의 원소(데이터)를 가리키고, 다음/이전 원소로 이동 가능

vector<int> v(10);

for (vector<int>::size_type i = 0; i < v.size(); i++)
	v[i] = i;

vector<int>::iterator it;

iterator도 class다.

위 설명 코드 ex)

class MyIterator
{
};

class MyVector
{
	public:
		typedef MyIterator iterator;
		typedef unsigned int size_type;
}

 

pointer와 비교해서 설명한 ex)

iterator는 pointer처럼 활용할 수 있다.

vector<int> v(10);

for (vector<int>::size_type i = 0; i < v.size(); i++)
	v[i] = i;

vector<int>::iterator it;
int* ptr;

it = v.begin()
ptr = &v[0];

cout << (*it) << endl;
cout << (*ptr) << endl;

iterator엔 ptr과 똑같이 주소값을 들고있다.

그럴거면 pointer를 사용하지 왜 iterator를 사용하나?

iterator엔 주소값과 더불어 자신이 어떤 컨테이너에 소속되어 있는지 갖고 있다.

pointer는 주인님이 없는데, iterator엔 누구에게 소속된 정보가 있다.

그럼에도 불구하고, 데이터를 접근하는 문법자체는 똑같이 지원하기 때문에 pointer처럼 활용, 생각할 수 있는 것이다.

 

iterator 자체는 class지만, 그 클래스타입을 마치 우리가 pointer처럼 사용할 수 있도록 온갖 문법들이 지원된 것이다.

it++;
++it;
ptr++;
++ptr;

it += 2;
it = it - 2;

iterator도 내부적으로 pointer를 들고있는 형태로 동작하고, + - 덧셈 뺄셈 등 포인터 문법을 그대로 따라간다.

 

vector<int>:: iterator itBegin = v.begin();
vector<int>:: iterator itEnd = v.end();

itBegin은 내부 포인터가 컨테이너의 첫번째 주소값을 가리키지만, itEnd의 내부 포인터는 컨테이너 유효한 값의 다음 주소, 즉 쓰레기값인 주소를 가리킨다.

itBegin은 활용이 가능하지만, itEnd는 활용하는 것이 아니고, 끝을 판별할 때 사용하는 개념이라 볼 수 있다.

 

end의 활용

for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	cout << (*it) << endl;

 

iterator 자체는 내부적으로 pointer가 숨겨져있다는 걸로 볼 수 있다.

int* ptrBegin = &v[0];          // v.begin()._Ptr;
int* ptrEnd = ptrBegin + 10;    // v.end()._Ptr;
for (int* ptr = ptrBegin; ptr != ptrEnd; ++ptr)
	cout << (*ptr) << endl;

iterator는 vector뿐 아니라, 다른 container에도 공통적으로 있는 개념이다.

 

iterator는 다양한 종류가 있다

// const iterator
vector<int>::const_iterator cit1 = v.cbegin();
cit1 = 100;        // 수정이 안된다. [컴파일 오류]

// reverse iterator
for (vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
	cout << (*it) << endl;

'[C++] Data Structure & Algorithm > STL' 카테고리의 다른 글

[STL] list #1  (0) 2023.05.15
[STL] vector #4  (0) 2023.05.15
[STL] vector #3  (0) 2023.05.15
[STL] vector #1  (0) 2023.05.15
[STL] 범용 수치 알고리즘(accumulate, inner_product)  (0) 2023.05.12

댓글