Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL 리스트(List) 완벽 가이드 – 주요 멤버 함수 총정리


리스트(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)
    매개변수: 없음
    반환값: 없음