iterator

iterator는 C++만의 개념이 아니다. python도 있고 java에도 있다.

C++에서 iterator의 개념만 확실히 잡으면 다른 언어에서 iterator는 공짜다.

 

iterator는 한마디로 그냥 포인터다. 어떤 포인터? 배열의 요소를 가르키는 포인터

C++ 표준 라이브러리 Vector에서 begin 함수는 배열의 처음 주소를 반환하는 함수다.

 

그러니깐 scores.begin()이라고 하면 scores Vector 배열의 첫번째 주소를 반환해준다 

iter = scores.begin()에서 iter는 첫번째 주소를 가지고 있는 포인터니깐 *iter라고 하면 그 값을 참조해서 가져온다.

 

참고로 주의해야 할 점은 end함수는 vector의 마지막 요소 바로 뒤 그러니깐 쓸모없는 값을 가르키는 주소를 반환해준다! 그래야 for loop 돌릴때 편하기 때문!(조건 iter != socres.end())

#include <stdio.h>
#include <iostream>
#include <vector>

int main()
{
	std::vector<int> scores;
	scores.reserve(3);

	scores.push_back(10);
	scores.push_back(20);
	scores.push_back(30);


	for (std::vector<int>::iterator iter = scores.begin(); iter != scores.end(); ++iter)
	{
		std::cout << *iter << std::endl;
	}

}

 

iterator 그림

포큐아카데미 C++

 

 

iterator insert, delete
	std::vector<int>::iterator it = scores.begin();
	scores.insert(it, 90);

위의 코드에서 it는 socres의 첫번째 배열 주소를 가리키는 포인터다.

그 상태에서 insert를 하게되면 첫번째 주소에 90을 넣으라는 코드다.

 

그 다음 index에 insert 하고 싶으면 it++ 연산자를 이용해서 주소를 (+) 하면된다

 

삭제도 간단하다 insert 대신 erase를 사용하면 된다

 

insert, delete를 하면 연속된 배열이기 때문에 어쩔수없이 메모리 복사가 및 재할당이 일어난다.

위의 코드처럼 첫번째 요소에 90을 넣을때 모든 배열 요소를 한칸씩 뒤로 미루는 우로밀착을 한뒤에 90을 넣어야 한다(복사)

 

재할당은 현재 사용중인 배열의 capacity를 초과했을때 메모리를 다시 할당하는(malloc)을 해줘야한다. 세상에 공짜는 없는듯하다

 

'C++' 카테고리의 다른 글

C++ 템플릿  (0) 2020.04.21
C++ 객체 백터 Vector  (0) 2020.04.17
C++ 정적 바인딩, 동적 바인딩  (1) 2020.04.09
C++ 멤버함수의 메모리 위치  (0) 2020.04.09
C++ 객체 생성  (0) 2020.04.02

+ Recent posts