본문 바로가기

IT/Programming Language

[C++/STL] STL 사용법 : Container - List

반응형

list

list는 이중 연결 리스트를 구현한 컨테이너입니다.

 

주요 특징

  1. 이중 연결 리스트 : 각 노드는 이전 노드와 다음 노드에 대한 포인터를 가지고 있어, 양방향으로 탐색이 가능합니다.
  2. 다이나믹 크기 : 동적으로 크기가 조정되므로, 요소가 추가될 때 자동으로 메모리를 할당하거나 해제합니다.
  3. 비순차적 저장 : 메모리 내에서 요소가 불규칙하게 저장될 수 있어, 중간에 삽입하거나 삭제할 때 빠릅니다.
  4. 랜덤 액세스 없음 : 임의 접근이 불가능하므로, 인덱스를 통해 요소에 접근할 수 없습니다. 요소에 접근하려면 순차적으로 탐색해야 합니다.

 

선언

#include <list>
std::list< char > li;

// example
std::list< char > li1 = { 'a', 'b', 'c', 'd', 'e' };  // 크기가 5인 리스트, 초기값 등록
std::list< char > li2(10);                            // 크기가 10인 리스트, 기본값으로 초기화
std::list< char > li3(10, 'a');                       // 크기가 10인 리스트, 모든 원소 'a'로 초기화

 

 

함수

Iterators

함수 설명
begin() 첫번째 원소를 가리키는 iterator를 반환
end() 마지막 원소의 다음을 가리키는 iterator를 반환
cbegin() 첫번째 원소를 가리키는 상수 iterator를 반환
cend() 마지막 원소의 다음을 가리키는 상수 iterator를 반환
rbegin() 역 순차열의 첫 번째 원소를 가리키는 iterator를 반환
rend() 역 순차열의 마지막 원소의 다음을 가리키는 iterator를 반환
crbegin() 역 순차열의 첫 번째 원소를 가리키는 상수 iterator를 반환
crend() 역 순차열의 마지막 원소의 다음을 가리키는 상수 iterator를 반환

 

 

기타 접근 또는 사용 관련

함수 설명
front() 첫번째 원소의 값
back() 마지막 원소의 값
empty() 비어있다면 true, 아니라면 false 반환
size() 크기 반환
push_front(T value) 리스트 맨 앞에 원소 추가
push_back(T value) 리스트 맨 뒤에 원소 추가
pop_front() 리스트 맨 앞의 원소 삭제
pop_back() 리스트 맨 뒤의 원소 삭제
insert(iterator it, T value) iterator가 가리키는 부분의 앞에 원소 추가
erase(iterator it1, [iterator it2]) 원하는 위치, 범위의 원소 삭제
splice(iterator pos, list<T> li2) 리스트 pos 위치에 li2 이동
splice(iterator pos, list<T> li2, iterator it) 리스트 pos 위치에 li2의 it 이동
splice(iterator pos, list<T> li2, iterator first, iterator last) 리스트 pos 위치에 li2의 (first, last) 구간 이동

 

 

사용 예시

#include <iostream>
#include <list>

using namespace std;

int main() {
    // 리스트 선언 
    list<int> a;

    // 원소 추가 
    a.push_back(22);
    a.push_back(33);
    a.push_front(11);
    a.push_back(44);
    a.push_back(55);

    // 반복자 생성 
    list<int>::iterator iter = a.begin();

    // 리스트 출력 
    for (iter = a.begin(); iter != a.end(); iter++)
        cout << *iter << endl; // 원본 리스트: 11 22 33 44 55 

    cout << "" << endl;
    cout << "" << endl;

    // 원소 삭제 
    a.pop_front();
    a.pop_back();

    for (iter = a.begin(); iter != a.end(); iter++)
        cout << *iter << endl; // 원소 삭제후 리스트: 22 33 44 

    cout << "" << endl;

    // 리스트 사이즈 출력 
    cout << a.size() << endl; // 3 출력( 22, 33, 44 이므로) 

    // 리스트가 비어있는가 
    cout << a.empty() << endl; // 비어있지 않으므로 0 반환 

    // 리스트 첫번째 원소 출력 
    cout << a.front() << endl; // 22 

    // 리스트 마지막 원소 출력 
    cout << a.back() << endl; // 44 

    cout << "" << endl;
    cout << "" << endl;

    // 리스트 두번째, 세번째 위치에 원소 추가
    a.insert(++a.begin(), 55555);
    a.insert(next(a.begin(), 2), 11111);
    for (iter = a.begin(); iter != a.end(); iter++)
        cout << *iter << endl; // 22,55555,11111,33,44

    cout << "" << endl;
    cout << "" << endl;

    // 리스트 중간에 다른 리스트 삽입 (splice)
    list<int> b{ 9,9,9 };
    a.splice(next(a.begin(), 3), b, b.begin(), --b.end());
    for (auto x : a) cout << x << endl; // 22,55555,11111,9,9,33,44
    cout << "" << endl;
    for (auto x : b) cout << x << endl; // 9
}
반응형