본문 바로가기

IT/Programming Language

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

반응형

forward_list

forward_list는 단일 연결 리스트를 구현한 컨테이너입니다.
list와 비슷하지만, 양방향 링크 대신에 단일 방향 링크만을 제공합니다.

 

주요 특징

  1. 단일 방향 연결 리스트 : 각 노드는 다음 노드에 대한 포인터만 가지고 있어, 반대 방향으로는 탐색할 수 없습니다.
  2. 더 적은 메모리 사용 : 각 노드에서 이전 노드에 대한 포인터가 없기 때문에, 메모리 사용량이 list보다 적습니다.
  3. 비순차적 저장 : 요소가 메모리 내에서 불규칙하게 저장되며, 중간에 삽입하거나 삭제할 때 효율적입니다.
  4. 랜덤 액세스 없음 : 임의 접근이 불가능하므로, 인덱스를 통해 요소에 접근할 수 없습니다. 요소에 접근하려면 순차적으로 탐색해야 합니다.

 

선언

#include<forward_list>
std::forward_list< int > flist;

// example
std::forward_list< int > flist = {1, 2, 3, 4, 5};   // 크기가 5인 forward list, 초기값 등록
std::forward_list< int > flist(10);                 // 크기가 10인 forward list, 기본값으로 초기화
std::forward_list< int > flist(10, 4);              // 크기가 10인 forward list, 4로 초기화

 

 

함수

Iterators

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

 

기타 접근 또는 사용 관련

함수 설명
front() 첫번째 원소의 값
empty() 비어있다면 true, 아니라면 false 반환
push_front(T value) 리스트 맨 앞에 원소 추가
pop_front() 리스트 맨 앞의 원소 삭제
insert_after(iterator it, T value) iterator가 가리키는 부분의 다음에 원소 추가
erase_after(iterator first, [iterator last]) 선택한 위치 다음의 원소 삭제, last iterator도 붙이면 그 범위의 원소 삭제

 

사용 예시

#include <iostream>
#include <forward_list>

using namespace std;

int main(void) {
    forward_list< int > flist;

    for (int i = 0; i < 5; i++)
        flist.push_front(i + 1);

    // iterator 선언
    forward_list<int>::iterator it;

    //// 반복문 출력
    for (auto it = flist.begin(); it != flist.end(); it++)
        cout << *it << " ";
    cout << endl;
    cout << endl;

    // 데이터 삽입
    flist.push_front(6);
    flist.emplace_front(7);

    for (auto it = flist.begin(); it != flist.end(); it++)
        cout << *it << " ";
    cout << endl;
    cout << endl;

    // 데이터 중간 삽입
    flist.insert_after(++flist.begin(), -1);
    flist.emplace_after(++flist.begin(), -2);

    for (auto it = flist.begin(); it != flist.end(); it++)
        cout << *it << " ";
    cout << endl;
    cout << endl;

    // 데이터 삭제
    flist.pop_front();

    for (auto it = flist.begin(); it != flist.end(); it++)
        cout << *it << " ";
    cout << endl;
    cout << endl;


    flist.erase_after(flist.begin());

    for (auto it = flist.begin(); it != flist.end(); it++)
        cout << *it << " ";
    cout << endl;
    cout << endl;
}
반응형