c++에 정의되어 있는 보통의 컨테이너와 마찬가지로 std::list 역시 end()는 마지막 노드 다음을 가리키고 있다.
list는 이터레이터 증가/감소가 1씩만 가능하고 임의의 원소에 바로 접근하는 건 불가능하다.
그리고 좋은 점은 벡터와 달리 이터레이터를 이용해 erase 해도 이터레이터를 계속 사용 가능하다.
중간에 원소 삽입/삭제 또한 O(1) 시간복잡도면 가능하다.
중간의 원소를 가리키는 이터레이터를 이용해서 erase(itr); 이렇게 코드를 사용했다고 해보자.
그리고 erase() 함수의 리턴값을 사용하지 않았다고 치자. 이터레이터가 가리키고 있던 노드가 삭제되었다.
힙 영역의 어느 한 곳의 주소값을 가지고 있었는데 그 주소값은 존재하지 않는 값이 되었다.
그러니 itr-- / itr++ 을 이용해 다른 노드를 가리키려 해도 컴퓨터는 가야할 곳을 못 찾는다. 모르는 주소의 하나 앞에 있는 주소, 하나 뒤의 주소를 어찌 알겠는가? (std::list는 노드들이 메모리 상에 연속적으로 존재하지 않는다.)
그러므로 아래 코드처럼 list에서 erase() 함수를 사용 시 리턴 값을 받아야 한다.
itr = lst.erase(itr);
list에 정의되어 있는 erase() 리턴값은 무엇인가?
erase()로 삭제한 원소의 다음 원소를 가리키는 이터레이터를 리턴해준다.
세번쨰 원소를 삭제했으면 네번째 원소를 가리키는 이터레이터를 리턴값으로 주는 것이다.
이미지 출처
cppreference.com
'백준 > 이걸 몰랐네' 카테고리의 다른 글
벡터 size()를 함부로 사용하지 말아야 하는 경우 (0) | 2020.10.04 |
---|---|
인덱스를 통한 배열 접근 시 항상 조심하자 (0) | 2020.09.17 |
예제 입출력은 분명 맞는데 틀렸다고 할때 대처법 (0) | 2020.08.31 |
배열을 fill()로 초기화해주자. (0) | 2020.08.31 |
백준 11720번 숫자의 합(문자로 안 받고 정수로 받기) (0) | 2020.08.30 |