C++ STL에서 제공하는 리스트(list) 컨테이너의 insert( ) 함수가 어떤 기능을 수행하는지 자세히 알아보겠습니다.
STL에서 리스트(List)란?
리스트는 시퀀스 내 어느 위치에서든 상수 시간(O(1))에 요소를 삽입하고 삭제할 수 있는 컨테이너입니다. 내부적으로 이중 연결 리스트(doubly linked list)로 구현되어 있어 메모리가 연속적으로 할당되지 않아도 됩니다.
리스트는 배열(array), 벡터(vector), 덱(deque)에 비해 컨테이너 내 임의 위치에서의 요소 삽입·추출·이동 성능이 뛰어납니다. 다만 특정 요소에 직접 접근(random access)하는 속도는 느린 편입니다. 리스트는 forward_list와 유사하지만, forward_list는 단일 연결 리스트(singly linked list)로 앞 방향으로만 순회할 수 있다는 차이가 있습니다.
insert( ) 함수란?
리스트의 insert( ) 함수는 리스트에 새로운 요소를 삽입할 때 사용하며, 다음 세 가지 방식으로 활용할 수 있습니다.
- 지정한 위치에 요소 하나를 삽입합니다.
- 동일한 요소를 n개 반복해서 삽입합니다.
- 지정한 범위(range)에 있는 여러 요소를 한 번에 삽입합니다.
문법(Syntax)
insert(iterator position, const value_type& val); insert(iterator position, size_type n, const value_type& value); insert(iterator position, iterator first, iterator last);
매개변수(Parameters)
- val — 리스트에 삽입할 새로운 요소의 값을 지정합니다.
- position — 새 요소가 삽입될 컨테이너 내 위치를 나타내는 반복자입니다.
- n — 삽입할 요소의 개수입니다.
- first, last — 삽입할 요소들의 범위를 지정하는 반복자입니다.
반환값(Return Value)
새롭게 삽입된 첫 번째 요소를 가리키는 반복자를 반환합니다.
예시
입력 리스트 — 50 60 80 90 → 출력 새 리스트 — 50 60 70 80 90
입력 리스트 — T R E N D → 출력 새 리스트 — T R E N D S
구현 순서
- 먼저 리스트를 선언합니다.
- 리스트의 현재 내용을 출력합니다.
- insert( ) 함수를 호출하여 새 요소를 삽입합니다.
- 삽입 후 변경된 리스트를 출력합니다.
위 순서를 따르면 리스트에 새 요소를 손쉽게 삽입할 수 있으며, 이때 삽입되는 요소는 반드시 리스트와 같은 데이터 타입이어야 합니다.
예제 1: 값 하나 삽입하기
// STL에서 list insert( ) 함수의 동작을 보여주는 C++ 코드
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> lst = { 55, 84, 38, 66, 67 };
// 리스트 출력
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// insert( ) 함수로 맨 앞에 6 삽입
lst.insert(lst.begin(), 6);
// 새 요소 삽입 후 리스트 출력
cout << "\nNew List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
List: 55 84 38 66 67 New List: 6 84 38 66 67
예제 2: 지정한 개수만큼 삽입하기
// STL에서 list insert( ) 함수의 동작을 보여주는 C++ 코드
#include <iostream>
#include <list>
using namespace std;
int main() {
list<char> lst = { 'F', 'B', 'U', 'A', 'R', 'Y' };
// 리스트 출력
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// 두 번째 위치에 'E'를 1개 삽입
auto pos = lst.begin();
advance(pos, 1);
lst.insert(pos, 1, 'E');
// 새 요소 삽입 후 리스트 출력
cout << "\nNew List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
List: F B U A R Y New List: F E B U A R Y
예제 3: 범위(range) 삽입하기
// STL에서 list insert( ) 함수의 동작을 보여주는 C++ 코드
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main() {
list<int> lst = { 10, 44, 34, 98, 15 };
// 리스트 출력
cout << "List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
// 값 17로 채운 크기 2의 벡터를 범위 삽입
vector<int> v(2, 17);
lst.insert(lst.begin(), v.begin(), v.end());
// 새 요소 삽입 후 리스트 출력
cout << "\nNew List: ";
for (auto x = lst.begin(); x != lst.end(); ++x)
cout << *x << " ";
return 0;
}
실행 결과
List: 10 44 34 98 15 New List: 17 17 10 44 34 98 15
마무리
리스트의 insert( ) 함수는 삽입 위치만 지정하면 되므로, 벡터처럼 기존 요소들을 뒤로 밀어내는 비용 없이 효율적으로 동작합니다. 값 하나 삽입, n개 반복 삽입, 범위 삽입이라는 세 가지 오버로드를 상황에 맞게 활용하면 연결 리스트 기반 자료 구조를 훨씬 유연하게 다룰 수 있습니다.