튀김족발
공부 끄적이는 공간
튀김족발
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • C++ (10)
    • DirectX (12)
    • Unreal (11)
    • Unity (0)
    • EASTL (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
튀김족발

공부 끄적이는 공간

1. STL - Contaier and Iterator
C++

1. STL - Contaier and Iterator

2022. 11. 30. 21:26

C++로 개발할 때는 그냥 사용했지, 내부구조가 어떻고, 어떤 방식으로 구현돼있는지 몰랐다. 따라서, 현재 C++에서 가장 많이 사용되고 있는 라이브러리인 STL에 대해 공부해본다.

 

Container

여러가지 요소들을 담고있는 자료구조

많이 사용되고 있는 vector, linked_list, 그리고 tree 등등 원하는 자료형을 담아둔 자료구조를 Container라고 한다. 

 

Iterator

컨테이너의 요소들을 클래스 외부에서 접근할 때 사용되는 포인터

위에서 언급한 자료구조들을 Iterator를 사용하여 접근 할 수 있다.

 

간단히 어떻게 사용되는지, 그리고 어떤 구조로 만들어져 있는지 확인해보자

 

vector

void main()
{
	std::vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

	for (int i = 0; i < v.size(); i++)
	{
		printf("%d\n", v[i]);
	}
	printf("\n");

	std::vector<int>::iterator vit;
	for (vit = v.begin(); vit < v.end(); vit++)
	{
		const int value = *vit;
		printf("%d\n", value);
	}
}

출력

기본적으로 처음에는 vector의 각 요소를 index로 접근 하여 출력한 방법이고, 두번째는 iterator를 사용해서 접근하는 방법이다.

이제 간단히 vector를 만들어보자!

 

myVector

template<typename T>
class myVector
{
private:
	T data[100];
	int iBegin;
	int iEnd;
public:
	myVector()
	{
		iBegin = 0;
		iEnd = 0;
	}

	void push_back(const T& insertData)
	{
		data[iEnd] = insertData;
		iEnd +=1;
	}

	T& operator[](const int& index)
	{
		return data[index];
	}

	int size() const
	{
		return iEnd - iBegin;
	}
};

iterator를 제외한 아주 기본적인 vector이다. (STL의 vector는 이렇게 간단히 구현되있지 않다.)

각 시작과 마지막 요소의 인덱스 값을 갖고있고 operator로 [] 이 배열 대괄호를 재정의 해주었다.

 

int main()
{
	myVector<int> temp;
	temp.push_back(1);
	temp.push_back(2);
	temp.push_back(3);
	temp.push_back(4);
	temp.push_back(5);
	
	for (int i = 0; i < temp.size(); i++)
	{
		printf("%d\n", temp[i]);
	}
}

출력

index로 접근하여 출력하는 방식은 구현 했다!! 그러면 iterator를 사용해서 출력하는 방법은 뭘까

 

template<typename T>
class myVector
{
public:
	typedef T* iterator;
private:
	T data[100];
	int iBegin;
	int iEnd;
public:
	myVector()
	{
		iBegin = 0;
		iEnd = 0;
	}

	void push_back(const T& insertData)
	{
		data[iEnd] = insertData;
		iEnd +=1;
	}

	T& operator[](const int& index)
	{
		return data[index];
	}

	int size() const
	{
		return iEnd - iBegin;
	}

	iterator begin()
	{
		return &data[iBegin];
	}

	iterator end()
	{
		return &data[iEnd];
	}
};

생각보다 간단하다. 그냥 포인터로 접근하여 리턴 해주면 된다. 이런 식으로 하면, iterator++ 연산자를 사용해도 다음 배열의 값을 참조하기 때문에 vector의 iterator와 같은 동작을 한다.

 

int main()
{
    myVector<int> temp;
	temp.push_back(1);
	temp.push_back(2);
	temp.push_back(3);
	temp.push_back(4);
	temp.push_back(5);
	
	for (int i = 0; i < temp.size(); i++)
	{
		printf("%d\n", temp[i]);
	}
	printf("\n");
    
	myVector<int>::iterator it;
	for (it = temp.begin(); it != temp.end(); it++)
	{
		const int idata = *it;
		std::cout << idata << std::endl;
	}
}

STL 의 vector와 같은 명령어를 사용하여 출력 하는 기능을 만들었다!

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

6. STL Placement new  (0) 2022.12.17
5. Operator Overloading03 operator new  (2) 2022.12.17
4. Operator Overloading Ostream  (0) 2022.12.14
3. Operator Overloading Function  (0) 2022.12.14
2. Base From Member Idiom  (0) 2022.12.04
    'C++' 카테고리의 다른 글
    • 5. Operator Overloading03 operator new
    • 4. Operator Overloading Ostream
    • 3. Operator Overloading Function
    • 2. Base From Member Idiom
    튀김족발
    튀김족발

    티스토리툴바