이 글에서는 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) 시간에 이동하는 고성능 함수입니다.
복사가 아닌 노드 재연결 방식이므로 이터레이터와 참조의 유효성이 유지됩니다.
전체 리스트, 단일 요소, 특정 범위의 요소를 선택적으로 이동할 수 있는 세 가지 오버로드를 제공합니다.
이동 후 원본 리스트에서 해당 요소들은 제거되며, 두 리스트의 크기가 자동으로 갱신됩니다.