본문 바로가기
Programming/c++ Design Pattern

[C++] Iterator

by 드가보자 2023. 12. 1.

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 = s.begin();
	auto p2 = v.begin();

	while (p1 != s.end())
	{
		std::cout << &(*p1) << std::endl;
		++p1;
	}

	std::cout << "====================================\n\n";
	while (p2 != v.end())
	{
		std::cout << &(*p2) << std::endl;
		++p2;
	}
}

 

여기서 list와 vector에 대해서 볼껀데, 

여기서 p1과 p2는 List와 Vector의 iterator 객체가 된다.

p1 iterator 에는 list의 첫 번째 요소(1)의 메모리 주소 값이 있을 것이다.

여기서 ++p1을 처리해주면 두 번째 요소(2)의 메모리 주소값이 iterator 객체에 기록되게 된다.

 

여기서 만약 &(p1)은 iterator 객체의 주소이다 => list나 vector 요소들에 대한 메모리 주소가 아님.

list나 vector의 요소들에 대해서 메모리 주소가 알고 싶으면 &(*p1) 이렇게 처리를 해주는 것이 맞다.

 

list는 연속하지 않은 메모리 들이  ㅇ----------------ㅇ--------ㅇ------------ㅇ------ㅇ 이렇게 연결되어 있는 구조라면

Vector는 연속한 메모리 들이 ㅁㅁㅁㅁㅁ 이렇게 붙어있는 구조이다.

그래서 iterator 들을 ++ 시키면서 메모리 주소가 어떻게 되는지에 대해 알아보았다.

List의 메모리들을 보면은 불규칙적이라는 것을 알 수 있고, vector를 보면 메모리가 (int) 4byte만큼 꾸준히 증가함을 보임.

 

single linked list를 만들어 보려고 하는데

 

#include <iostream>

template<typename T> struct Node
{
	T     data;
	Node* next;

	Node(const T& d, Node* n) : data(d), next(n) {}
};

template<typename T> struct slist
{
	Node<T>* head = 0;
public:
	void push_front(const T& a) { head = new Node<T>(a, head); }
};

int main()
{
	slist<int> s;
	s.push_front(10);
	s.push_front(20);
	s.push_front(30);
	s.push_front(40);
}

 

List는 Node 들이 쭉쭉쭉쭉 연결되어 있다고 생각하면 된다.

Node는 Data와, 다음에 있을 노드의 메모리 주소를 나타낸다.

 

10이 제일 먼저 들어가는데, 이 Node는 Data는 10 , head는 null 이고, head의 값은 이 Node 의 주소 값으로 갱신된다. 

20은 두 번째로 들어가는데, 이 Node는 Data는 20 , head는 이전 노드의 메모리 주소이고, head의 값은 (20)의 Node 의 주소 값으로 갱신된다.  

 

[40, 30의 메모리 주소] => [ 30, 20의 메모리 주소] => [20,10의 메모리주소] => [10, null] 이런식으로 되는 것이다

 

iterator가 begin 부분말 알면 next의 주소를 따라서 쭉쭉 이동하면 결국 끝까지 이동할 수 있는 것이다.

'Programming > c++ Design Pattern' 카테고리의 다른 글

[C++ Design Pattern] Visitor  (1) 2023.12.01
[C++ Design patter] Factory.  (1) 2023.11.30
[C++ Design Pattern] Flyweight  (1) 2023.11.30
[C++ Design Pattern] Adapter  (0) 2023.11.30
[C++ Design Pattern] Decorator  (0) 2023.11.29