[STL] List Container

Seonghun Kim·2022년 7월 17일
1

C++!

목록 보기
5/10
post-thumbnail

📌 list container

  • sequence container
  • doubly linked list
    • index로 직접 접근이 불가능
    • 양끝 부분의 값들에만 접근 가능하며, 그 사이의 값들은 순차적으로 하나씩 선형탐색해야 접근 가능
  • deque와 같이 앞뒤로의 원소 추가가 효율적
  • insert, erase와 같은 중간 값 추가/제거 측면에서는 vector, deque보다 성능이 우수
  • 원소 접근 보다는 추가/제거 등이 빈번한 경우 사용

✔ list 사용

#include <list>
using namespace std;
  • <list> header
  • std::list

✔ list 생성

list<[type]> [name]

// 비어있는 정수형 타입 list li1를 생성
list<int> li1;

// 기본값으로 초기화된 10개의 원소를 가지는 list li2 생성
list<int> li2(10);

// 'A'로 초기화된 5개의 원소를 가지는 list li3 생성
list<char> li3(5, 'A');

// 'A', 'B', 'C' 원소를 가지는 list li4 생성
list<char> li4 = { 'A', 'B', 'C' };
  • list 저장될 타입을 명시
  • list 크기만 지정한 경우, 기본값(0)으로 초기화
  • 하드코딩 방식으로 초기화 가능

✔ list 연산자

list<int> li1(5, 7);
list<int> li2 = { 7, 7, 7, 7, 7 };
list<int> li3 = { 7, 7, 7, 8 };

if (li1 == li2)  // true
    cout << "동일한 list";
if (li2 < li3)  // true
    cout << "d3이 d2보다 큰 list";
  • 비교 연산자 사용 가능

✔ list 멤버 함수

1) element access & capacity

functiondescription
li.front()첫번째 원소 반환
li.back()마지막 원소 반환
li.size()list l의 크기 반환
li.empty()비어있으면 true, 그렇지 않으면 false 반환
list<int> li1 = { 10, 20, 30, 40, 50 };
list<int> li2;

cout << li1.front();     // 10
cout << li1.back();      // 50

cout << li1.size();      // 5
cout << li2.size();      // 0

if (li2.empty())  // true
    cout << "li2 size is 0";

2) iterators

functiondescription
li.begin()첫번째 원소를 가리키는 iterator
li.end()마지막 원소의 다음을 가리키는 iterator
li.rbegin()마지막 원소를 가리키는 iterator
li.rend()첫번째 원소의 이전을 가리키는 iterator

iterator(반복자) : 컨테이너에 저장된 요소를 반복적으로 순회하여 각 요소에 접근할 수 있도록 하는 객체

list<int> li = { 10, 20, 30, 40, 50, 60, 70, 80 };

list<int>::iterator iter;

for (iter = li.begin(); iter != li.end(); iter++)
{
    cout << *iter << " ";  // output : 10 20 30 40 50 60 70 80
}  

list<int>::reverse_iterator r_iter;

for (r_iter = li.rbegin(); r_iter != li.rend(); r_iter++)
{
    cout << *r_iter << " ";  // output : 80 70 60 50 40 30 20 10
}  

3) modifiers (수정)

functiondescription
li.push_front(x)원소 x를 첫번째 원소 앞에 추가
li.push_back(x)원소 x를 마지막 원소 뒤에 추가
li.pop_front()첫번째 원소 제거
li.pop_back()마지막 원소 제거
li.insert(iter, x)원소 x를 iter 위치에 삽입
li.insert(iter, n, x)n개의 원소 x를 iter 위치에 삽입
li.erase(iter)iter 위치의 원소 제거
li.erase(iter1, iter2)iter1 부터 iter2 이전까지 위치의 원소 제거
li.clear()모든 원소 제거
list<int> li = { 10, 20, 30 };

li.push_front(40);          // 40 10 20 30
li.pop_back();              // 40 10 20
li.push_back(50);           // 40 10 20 50
li.pop_front();             // 10 20 50

list<int>::iterator iter = li.begin();
li.insert(iter, 60);                // 60 (10) 20 50
iter++;                             // 60 10 (20) 50
li.insert(iter, 3, 70);             // 60 10 70 70 70 (20) 50
iter--;                             // 60 10 70 70 (70) 20 50
iter = li.erase(iter);              // 60 10 70 70 (20) 50
iter--;                             // 60 10 70 (70) 20 50
iter = li.erase(li.begin(), iter);  // (70) 20 50
  • iterator를 하나씩 이동하면서 추가/제거
  • insert 후, iterator 위치의 원소는 그대로 유지
  • erase 후, 삭제된 위치의 iterator를 반환 받음

4) operations (연산)

functiondescription
li.remove(x)리스트 내의 원소 x를 모두 제거
li.remove_if(pred)pred 함수의 반환 값이 true인 원소 모두 제거
li.sort(comp)comp 함수 기준으로 정렬 (default: 오름차순)
li.unique()연속으로 중복된 원소들을 모두 제거
list<int> li = { 0, 50, 20, 30, 30, -10, -20, 30, 50, 0, -40, 0, 20 };

li.remove(0);               // 50 20 30 30 -10 -20 30 50 -40 20 
li.remove_if([](int x)
    { return x < 0; });     // 50 20 30 30 30 50 20 

li.sort();                  // 20 20 30 30 30 50 50 
li.unique();                // 20 30 50 

0개의 댓글