본문 바로가기
알고리즘 부셔버렷/나만의 작은 STL정보

빈 컨테이너의 iterator, begin()과 end()는 무엇을 가리킬까. 그리고 증감 연산.

by Unagi_zoso 2022. 6. 16.

빈 컨테이너의 경우 begin()과 end()는 서로 같은 값을 가진다.

 

    list<int> li;
    auto it = li.begin();


    for (auto i = li.begin(); i == li.end();)
    {
        cout <<  "무한 루프";
    }
    
    // 컴파일 옵션
    // g++ -std=c++17 -O0 -o stl_list1 .\stl_list.cpp

 

 

begin()과 end()가 같은 빈 컨테이너의 경우, 증가와 감소같은 연산은 정의하지 않은 행동으로

예측하지 못한 값 등이 나온다. 가능한 이러한 경우는 회피하자.

 

 

 

응용

 

http://boj.kr/49ff74ffdded4e0381138dabbaf8405b

Authored by : BaaaaaaaaaaarkingDog 

백준 키로거 문제.  BaaaaaaaaaaarkingDog 님의 코드를 빌려왔습니다. 

 

for (int i = 0; i < n; i++) {
    list<char> L = {};
    string s;
    auto p = L.begin();

    cin >> s;
    for (auto c : s) {
      if (c == '<') {
        if (p != L.begin()) p--;  // 컨테이너가 비어있을 경우 begin()과 end()가 같아
      }							  // 해당 조건에서 false가 일어난다.
      else if (c == '>') {
        if (p != L.end()) p++;
      }
      else if (c == '-') {
        if (p != L.begin()) {
          p--;
          p = L.erase(p);
        }
      }
      else
        L.insert(p, c);      
    }

 

 

다음 글들을 참고하였습니다.

https://stackoverflow.com/questions/25600484/c-empty-container-iterator-behaviour

https://stackoverflow.com/questions/10793404/behaviour-of-stdlistbegin-when-list-is-empty

https://stackoverflow.com/questions/39820041/is-it-allowed-to-increment-an-end-iterator

 

 

읽어주셔서 감사합니다. 틀린 부분이나 부족한 부분이 있어 알려주신다면 감사하겠습니다.

댓글