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

C++ STL list::splice() 함수 완벽 가이드 – 문법과 실전 예제

이 글에서는 C++ STL에서 list::splice() 함수의 동작 원리, 문법, 그리고 실전 예제를 자세히 알아보겠습니다.

STL에서 list란 무엇인가?

list는 시퀀스 내 임의의 위치에서 상수 시간(O(1))에 삽입과 삭제가 가능한 자료구조입니다. 내부적으로 이중 연결 리스트(doubly linked list)로 구현되어 있어 메모리가 연속적으로 할당되지 않아도 됩니다.

list는 배열(array), vector, deque에 비해 컨테이너 내 임의 위치에서의 요소 삽입·추출·이동 작업에서 훨씬 뛰어난 성능을 보입니다. 다만 특정 요소에 직접 접근(임의 접근)은 느린 편입니다. list는 forward_list와 유사하지만, forward_list는 단일 연결 리스트로 앞쪽 방향으로만 순회할 수 있다는 차이가 있습니다.

list::splice()란?

list::splice()는 C++ STL의 <list> 헤더 파일에 선언된 내장 함수로, 한 list 컨테이너의 요소들을 다른 list 컨테이너의 특정 위치로 옮기는 데 사용됩니다.

splice()는 요소를 복사하는 것이 아니라 연결 리스트의 노드 포인터만 재연결하므로 매우 효율적입니다. 요소가 이동된 후에는 원본 리스트와 대상 리스트 양쪽 모두의 크기(size)가 자동으로 변경됩니다.

문법(Syntax)

splice() 함수의 문법은 다음 세 가지 형태로 정의할 수 있습니다.

list1.splice(position, list2);
list1.splice(position, list2, i);
list1.splice(position, list2, first, last);

매개변수

  • position − list1에서 요소를 삽입하고 싶은 위치를 가리키는 반복자입니다.

  • list2 − 요소를 가져올 원본 리스트입니다.

  • i − list2에서 이동시킬 단일 요소의 위치를 지정하는 반복자입니다. 해당 위치의 요소 하나만 list1으로 옮겨집니다.

  • first, last − list2에서 이동시킬 요소 범위의 시작과 끝을 정의하는 반복자입니다. [first, last) 범위에 속한 모든 요소가 이동합니다.

예제 1: 기본 동작 확인

#include <bits/stdc++.h>
using namespace std;
int main(){
    list<int> myList_1 = { 10, 20, 30, 40 };
    list<int> myList_2 = { 50, 60 };
    list<int>::iterator i;
    i = myList_2.begin();
    myList_1.splice(myList_1.end(), myList_2, i);
    cout << "splice 연산 후의 list" << endl;
    for (auto temp : myList_1)
        cout << temp << " ";
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

splice 연산 후의 list
10 20 30 40 50

myList_2의 첫 번째 요소인 50이 myList_1의 끝으로 이동했으며, myList_2에는 60만 남게 됩니다.

예제 2: 여러 리스트 간 요소 이동

#include <bits/stdc++.h>
using namespace std;
int main(){
    list<int> myList_1 = { 10, 20 };
    list<int> myList_2 = { 30, 40, 50 };
    list<int> myList_3 = { 60 };
    // myList_2의 모든 요소를 myList_1의 맨 앞으로 이동
    myList_1.splice(myList_1.begin(), myList_2);
    cout << "splice 연산 후의 list 1" << endl;
    for (auto x : myList_1)
        cout << x << " ";
    // myList_1의 모든 요소를 myList_3의 끝으로 이동
    myList_3.splice(myList_3.end(), myList_1);
    cout << "\nsplice 연산 후의 list 3" << endl;
    for (auto x : myList_3)
        cout << x << " ";
    return 0;
}

실행 결과

splice 연산 후의 list 1
30 40 50 10 20
splice 연산 후의 list 3
60 30 40 50 10 20

반환값

splice() 함수는 별도의 값을 반환하지 않습니다(반환 타입: void). 요소 이동은 컨테이너 내부에서 직접 수행되며, 결과는 호출 후 각 리스트를 순회하여 확인할 수 있습니다.

정리

  • splice()는 리스트 간 요소를 O(1) 시간에 이동하는 고성능 함수입니다.

  • 복사가 아닌 노드 재연결 방식이므로 이터레이터와 참조의 유효성이 유지됩니다.

  • 전체 리스트, 단일 요소, 특정 범위의 요소를 선택적으로 이동할 수 있는 세 가지 오버로드를 제공합니다.

  • 이동 후 원본 리스트에서 해당 요소들은 제거되며, 두 리스트의 크기가 자동으로 갱신됩니다.