C++ 개념 정리

13. iterator

CE : 하랑 2026. 1. 17. 20:00

 

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();
}

'C++ 개념 정리' 카테고리의 다른 글

15. std::map  (0) 2026.01.17
14. string_view  (0) 2026.01.17
12. std::vector  (0) 2026.01.17
11. 문자열 표준 정리  (0) 2026.01.11
10. C++ 전처리문  (0) 2026.01.11