(C++ STL : iterator-2) 컨테이너마다 지원하는 연산자

Posted by : at

Category : Cpp


#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;

int main(){
    vector<int> v = { 1, 3, 5, 7, 9, 10 };
    list<int> v = { 1, 3, 5, 7, 9, 10 };        

    sort(begin(v), end(v));
    // error! - vecor는 되는데 list는 에러가 난다

    for(auto& n : v)
        cout << n << ", ";
}

왜 list는 에러가 날까?
우선 아래를 먼저 이해하자.

#include <forward_list>
#include <list>
using namespace std;

int main()
{
    forward_list<int> s1 = { 1, 2, 3 };
    // forward_list는 single list(단방향 리스트)이다

    auto p = begin(s1);

    ++p;
    --p;        // forward_list이기에 구현을 하지 않음.
}

음… 컨테이너의 종류(반복자 카테고리)에 따라 갖은 기능이 다를 수 있구나

#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> s1 = { 1, 2, 3 };

    auto i = begin(s1);

    int n = *i;     // 입력이라 표기
    *i = 20;        // 출력이라 표기
}
  • list : ++연산은 제공 +는 어차피 속도의 향상이 없기에 제공하지 않음
  • vector : ++, +연산 모두 제공
  • deque : ++, +연산 모두 제공
#include <iostream>
#include <list>
using namespace std;

int main()
{
    list<int> s1 = { 1, 2, 3 };

    auto i1 = begin(s1);
    auto i2 = i1;

    if(i1 == i2)
    {
        cout << (*i1 == *i2) << endl;
        cout << (++i1 == ++i2) << endl;
    }
    // 두 개 이상의 iterator가 하나의 컨테이너를 가르킬 수 있는지? -> multipass guarantee라 한다.

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links