iterator (이터레이터 (반복자))
(1) 반복자는 컨테이너에 저장된 원소를 순회하고 접근하는 일반화된 방법을 제공합니다.
(2) 반복자는 컨테이너와 알고리즘이 하나로 동작하게 묶어주는 인터페이스 역할을 합니다.
-> 이 반복자 덕에 알고리즘은 특정 컨테이너에 종속적이지 않고 독립적이면서도 언제든지 컨테이너와 결합하여 동작 할 수 있습니다.
(3) std의 거의 모든 자료구조는 이터레이터(반복자)라는 통일된 인터페이스를 사용한다.
-> 순회를 돌리는 방식이 각 자료구조마다 다 달라
-> 그런데 그 인터페이스를 순회를 돌려주는 순회자라는 클래스를 만들고 똑같은 방식으로 이용하게 해서 진입 장벽을 낮춘것
vector
#include <iostream>
#include <vector>
class A
{
public:
void test()
{
std::cout << "ㅎㅇㄹ"<<"\n";
}
};
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
std::vector<A*> testA;
testA.resize(9);
for (size_t i = 0; i < 10; i++)
{
A* a = new A();
testA.push_back(a);
}
std::vector<A*>::iterator StartIter = testA.begin();
std::vector<A*>::iterator EndIter = testA.end();
for (; StartIter != EndIter; ++StartIter)
{
int sub = 0;
A* a=*StartIter; // a는 for문이 끝나면 알아서 메모리 정리
if (nullptr != a)
{
a->test();
}
// safe 메모리 삭제 방법
delete *StartIter; // 가리키고 있는 힙 메모리 삭제
*StartIter = nullptr; // 가리키는 메모리 주소 nullptr처리
}
sizeof(testA);
testA.clear();
int end = 0;
}
Map
#include <iostream>
#include <map>
#include <string>
class A
{
public:
void test()
{
std::cout << "ㅎㅇㄹ"<<"\n";
}
};
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
std::map<std::string, A*> test;
A* a = new A();
A* a1 = new A();
A* a2 = new A();
test.insert(std::pair<std::string, A*>("One", a)); // insert (pair) 방식
test.insert(std::make_pair("two", a1)); // insert (make_pair) 방식
test["three"] = a2; // 배열 연산자 방식
std::map<std::string, A*>::iterator StartIter = test.begin();
std::map<std::string, A*>::iterator EndIter = test.end();
for (; StartIter != EndIter; ++StartIter)
{
StartIter->second->test();
delete StartIter->second;
StartIter->second = nullptr;
}
sizeof(test);
test.clear();
}
list
#include <iostream>
#include <list>
#include <string>
class A
{
public:
void test()
{
std::cout << "ㅎㅇㄹ"<<"\n";
}
};
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
std::list<A*> Atest;
for (size_t i = 0; i < 5; i++)
{
A* a = new A();
Atest.push_front(a);
}
sizeof(Atest);
std::list<A*>::iterator StartIter = Atest.begin();
std::list<A*>::iterator EndIter = Atest.end();
for (; StartIter != EndIter; ++StartIter)
{
A* a = *StartIter;
a->test();
delete *StartIter;
*StartIter = nullptr;
}
sizeof(Atest);
Atest.clear();
}