백준/이걸 몰랐네

[c++]std::list::erase() 함수 사용 시 반환 값을 사용하자

발전생 2020. 9. 9. 19:54


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