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 |