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

C++ STL 리스트 insert( ) 함수 사용법 총정리 – 문법부터 예제까지

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

구현 순서

  1. 먼저 리스트를 선언합니다.
  2. 리스트의 현재 내용을 출력합니다.
  3. insert( ) 함수를 호출하여 새 요소를 삽입합니다.
  4. 삽입 후 변경된 리스트를 출력합니다.

위 순서를 따르면 리스트에 새 요소를 손쉽게 삽입할 수 있으며, 이때 삽입되는 요소는 반드시 리스트와 같은 데이터 타입이어야 합니다.

예제 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개 반복 삽입, 범위 삽입이라는 세 가지 오버로드를 상황에 맞게 활용하면 연결 리스트 기반 자료 구조를 훨씬 유연하게 다룰 수 있습니다.