리스트(List)는 데이터를 순차적인 방식으로 저장하면서도 각 요소에 연속되지 않은(non-contiguous) 메모리를 할당하는 컨테이너 유형입니다. C++에서 리스트는 이중 연결 리스트(doubly linked list)로 구현되어 있어, 앞·뒤 어느 쪽 끝에서든 요소를 삽입하거나 삭제할 수 있고 리스트를 양방향으로 순회(traverse)하는 것도 가능합니다. 만약 단일 연결 리스트(singly linked list)가 필요하다면 C++ STL에서 제공하는 forward_list를 사용하면 됩니다.
vector 대비 list의 장점
리스트는 반복자(iterator)가 이미 원하는 요소의 위치에 도달해 있다면, 해당 위치에서 요소를 삽입하거나 삭제하는 작업이 매우 빠르다는 것이 가장 큰 장점입니다.
list 사용 시의 단점
반면 리스트는 위치를 기준으로 특정 요소에 직접 접근하기 어렵습니다. 예를 들어 네 번째 요소를 가져오고 싶을 때 해당 위치로 곧바로 점프할 수 없으며, 반복자가 시작 또는 끝 위치에서부터 차례대로 이동해야 합니다.
리스트와 함께 사용할 수 있는 주요 함수
1. 삽입 관련 함수
push_front(element) – 리스트의 맨 앞에 요소를 삽입합니다.
문법:listName.push_front(datatype element)
매개변수: 삽입할 값 1개
반환값: 없음push_back(element) – 리스트의 맨 뒤에 요소를 삽입합니다.
문법:listName.push_back(datatype element)
매개변수: 삽입할 값 1개
반환값: 없음insert() – 지정한 위치에 요소를 삽입합니다.
문법:listName.insert(position, total, element)
매개변수: 세 개의 매개변수를 받습니다.- position – 요소를 삽입할 위치
- total – 삽입할 요소의 총 개수
- element – 삽입할 요소
반환값: 새로 삽입된 요소들의 시작 위치를 가리키는 반복자
emplace(position, value) – 지정한 위치에 새 요소를 직접 생성하여 삽입합니다.
문법:listName.emplace(position, value)
매개변수: 삽입할 위치와 삽입할 값, 두 개를 받습니다.
반환값: 새로 삽입된 요소를 가리키는 반복자emplace_front(element) – 리스트의 맨 앞에 새 요소를 직접 생성하여 삽입합니다.
문법:listName.emplace_front(element)
매개변수: 삽입할 값 1개
반환값: 없음emplace_back(element) – 리스트의 맨 뒤에 새 요소를 직접 생성하여 삽입합니다.
문법:listName.emplace_back(element)
매개변수: 삽입할 값 1개
반환값: 없음
2. 삭제 관련 함수
pop_front() – 리스트 앞쪽의 요소를 제거합니다.
문법:listName.pop_front()
매개변수: 없음
반환값: 없음pop_back() – 리스트 뒤쪽의 요소를 제거합니다.
문법:listName.pop_back()
매개변수: 없음
반환값: 없음remove(element) – 매개변수로 전달된 값과 일치하는 모든 요소를 삭제합니다.
문법:listName.remove(element)
매개변수: 삭제할 요소 1개
반환값: 없음remove_if(함수 포인터/함수 객체) – 매개변수로 전달된 조건을 만족하는 모든 요소를 삭제합니다.
문법:listName.remove_if(function pointer / function object)
매개변수: 함수 포인터 또는 함수 객체 1개
반환값: 없음erase() – 매개변수에 따라 단일 요소 또는 여러 요소를 삭제합니다.
문법:listName.erase(iterator position)또는listName.erase(iterator first_ele, iterator last_ele)
매개변수: 첫 번째 형식은 삭제할 요소의 위치를, 두 번째 형식은 삭제 범위의 시작 반복자와 끝 반복자를 받습니다.
반환값: 마지막으로 삭제된 요소의 다음 위치를 가리키는 반복자clear() – 리스트의 모든 요소를 삭제하고 크기를 0으로 초기화합니다.
문법:listName.clear()
매개변수: 없음
반환값: 없음unique() – 리스트에서 서로 인접한 중복 요소들을 제거합니다.
문법:listName.unique(predicate)
매개변수: 선택 사항으로, 두 값을 같다고 판단할 때 true를 반환하는 조건자(predicate)를 전달할 수 있습니다.
반환값: 없음
3. 접근 및 순회 관련 함수
front() – 리스트의 첫 번째 요소를 가져옵니다.
문법:listName.front()
매개변수: 없음
반환값: 첫 번째 요소에 대한 직접 참조back() – 리스트의 마지막 요소를 가져옵니다.
문법:listName.back()
매개변수: 없음
반환값: 마지막 요소에 대한 직접 참조begin() – 리스트의 첫 번째 요소를 가리키는 반복자를 반환합니다.
문법:listName.begin()
매개변수: 없음
반환값: 첫 번째 요소를 가리키는 반복자end() – 리스트의 끝(마지막 요소 다음 위치)을 가리키는 반복자를 반환합니다.
문법:listName.end()
매개변수: 없음
반환값: 리스트의 끝을 가리키는 반복자rbegin() – 리스트의 마지막 요소를 가리키는 역방향 반복자(reverse iterator)를 반환합니다.
문법:listName.rbegin()
매개변수: 없음
반환값: 마지막 요소를 가리키는 역방향 반복자rend() – 리스트의 첫 번째 요소 앞(역방향 끝)을 가리키는 역방향 반복자를 반환합니다.
문법:listName.rend()
매개변수: 없음
반환값: 역방향 순회의 끝을 가리키는 역방향 반복자cbegin() – 리스트의 시작을 가리키는 상수(const) 반복자를 반환합니다.
문법:listName.cbegin()
매개변수: 없음
반환값: 리스트의 시작을 가리키는 상수 반복자cend() – 리스트의 끝을 가리키는 상수 반복자를 반환합니다.
문법:listName.cend()
매개변수: 없음
반환값: 리스트의 끝을 가리키는 상수 반복자crbegin() – 리스트의 끝을 가리키는 상수 역방향 반복자를 반환합니다.
문법:listName.crbegin()
매개변수: 없음
반환값: 리스트의 끝을 가리키는 상수 역방향 반복자crend() – 리스트의 시작을 가리키는 상수 역방향 반복자를 반환합니다.
문법:listName.crend()
매개변수: 없음
반환값: 리스트의 시작을 가리키는 상수 역방향 반복자
4. 크기 및 상태 확인 함수
size() – 리스트에 저장된 전체 요소 개수를 반환합니다.
문법:listName.size()
매개변수: 없음
반환값: 리스트 내 전체 요소 개수resize() – 리스트의 전체 요소 개수를 조정합니다.
문법:listName.resize(int resized_number, value(optional))
매개변수: 두 개의 매개변수를 받습니다.- resized_number – 컨테이너 크기를 늘리거나 줄일 정확한 개수
- value(optional) – 선택 사항이며, 지정하면 늘어난 자리 끝에 해당 값이 추가됩니다.
반환값: 없음
max_size() – 리스트가 가질 수 있는 최대 요소 개수를 반환합니다.
문법:listName.max_size()
매개변수: 없음
반환값: 리스트가 가질 수 있는 최대 요소 개수empty() – 리스트가 비어 있는지 확인합니다.
문법:listName.empty()
매개변수: 없음
반환값:- true – 리스트가 비어 있는 경우
- false – 리스트에 요소가 존재하는 경우
5. 기타 연산 함수
reverse() – 리스트의 모든 요소 순서를 뒤집습니다.
문법:listName.reverse()
매개변수: 없음
반환값: 없음operator(=) – 한 리스트의 내용을 다른 리스트의 내용으로 대체합니다.
문법:listName_1 = listName_2
매개변수: 없음
반환값: 없음swap() – 같은 타입의 다른 리스트와 내용을 서로 교환합니다.
문법:listName_1.swap(listName_2)
매개변수: 없음
반환값: 없음merge() – 두 리스트의 요소를 하나로 병합합니다. 두 리스트가 정렬된 상태라면 병합 결과도 정렬이 유지됩니다.
문법:listName_1.merge(listName_2)
매개변수: 없음
반환값: 없음