반응형
std::list erase() 사용 시 연결은 왜 끊기지 않을까?
그동안 무심코 사용해왔던 std::list erase(), 생각해 보면 std::list는 포인터들의 연결이고 중간 삽입, 삭제가 빠르다 정도로 알고 있었다. 그러다가 연결된 리스트인데 중간을 제거하면 끊기는 거 아닌가라는 막연한 생각이 들기 시작했다.
- std::list는 이중 연결 리스트(doubly linked list) 구조이다.
- 이중 연결 리스트 구조이기 때문에 각 노드는 자신의 앞뒤 노드에 대한 위치 정보를 갖는다.
- 아래의 사슬과 같은 구조를 생각하면 쉽다.

erase() 제거 과정
- A <->B<->C 의 리스트에서 B를 erase() 하면
- A의 next를 C로 변경
- C의 prev를 A로 변경
- B 메모리 해제
- 결과적으로 A<->C가 완성
- B를 제거하였지만 연결은 끊기지 않는다.
erase() 내부 구현 코드
erase()의 내부 구현 코드를 보면 제거 시 prev, next를 앞뒤 노드에 연결하고 스스로를 제거하는 간단한 내용이라는 것을 알 수 있다. 그렇기 때문에 erase()를 통한 매우 빠른 제거가 가능하다. (O(1)의 시간 복잡도)
iterator erase(iterator pos)
{
Node* node = pos.node;
if (node == sentinel)
return end(); // end() erase 방지
Node* prev = node->prev;
Node* next = node->next;
prev->next = next;
next->prev = prev;
delete node;
--count;
return iterator(next);
}
정리하자면
- std::list는 "포인터를 연결한 노드 체인"이다.
- std::list는 이중 연결 리스트(doubly linked list) 구조이다.
- erase() 함수는 그 체인의 고리 하나를 제거하고 그 부분을 앞뒤로 연결하는 작업이다.
'프로그래밍 > C++' 카테고리의 다른 글
| C++ emplace_back()을 무조건 권장하지 않는 이유는? (0) | 2025.12.22 |
|---|---|
| C++ 기본 타입은 왜 std::move()로 이동되지 않는가? (0) | 2025.12.20 |
| 이동(move)이 더 효율적인데 emplace_back()은 왜 복사하는가? (0) | 2025.12.06 |
| C++ 표준 컨테이너는 언제나 깊은 복사를 한다. (0) | 2025.12.06 |
| C++ push_back()과 emplace_back() 차이 (0) | 2025.10.07 |
댓글