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

C++ STL forward_list 구현하기: 메뉴 기반 예제 프로그램

C++ STL의 std::forward_list는 단일 연결 리스트(singly linked list)를 구현한 컨테이너입니다. 양방향 리스트인 std::list가 각 노드에서 이전(previous)과 다음(next) 요소를 모두 추적하는 것과 달리, forward_list는 다음 요소의 위치만 기억하기 때문에 요소 하나를 저장하는 데 필요한 메모리 공간이 더 적습니다.

다만 이러한 단방향 구조의 특성상 개별 요소에 직접 접근(임의 접근)할 수 없고, 역방향으로 순회하는 것도 불가능하다는 단점이 있습니다. 따라서 forward_list는 삽입·삭제가 잦으면서 순차적으로만 데이터를 탐색하는 상황에 적합합니다.

주요 멤버 함수 정리

main() 함수에서 호출된 주요 함수:
    fl.resize()     = forward_list의 크기를 지정한 값으로 변경합니다.
    fl.push_front() = forward_list의 맨 앞에 요소를 추가합니다.
    fl.remove()     = 특정 값을 가진 요소를 forward_list에서 모두 삭제합니다.
    fl.unique()     = forward_list에서 인접한 중복 요소를 제거합니다.
    fl.reverse()    = forward_list의 요소 순서를 뒤집습니다.
    fl.front()      = forward_list의 첫 번째(맨 앞) 요소를 반환합니다.

예제 코드

아래 예제는 메뉴 방식으로 forward_list의 다양한 기능을 직접 테스트해 볼 수 있도록 작성된 콘솔 프로그램입니다.

#include<iostream>
#include <forward_list>
#include <string>
#include <cstdlib>
using namespace std;

int main() {
    forward_list<int> fl;
    forward_list<int>::iterator it;
    int c, n;
    while (1) {
        cout<<"1. 맨 앞에 요소 삽입"<<endl;
        cout<<"2. 맨 앞 요소 삭제"<<endl;
        cout<<"3. Forward List의 첫 번째 요소 출력"<<endl;
        cout<<"4. Forward List 크기 변경"<<endl;
        cout<<"5. 특정 값의 요소 삭제"<<endl;
        cout<<"6. 중복 값 제거"<<endl;
        cout<<"7. 요소 순서 뒤집기"<<endl;
        cout<<"8. Forward List 전체 출력"<<endl;
        cout<<"9. 종료"<<endl;
        cout<<"메뉴를 선택하세요: ";
        cin>>c;
        switch(c) {
            case 1:
                cout<<"맨 앞에 삽입할 값 입력: ";
                cin>>n;
                fl.push_front(n);
            break;
            case 2:
                n = fl.front();
                fl.pop_front();
                cout<<n<<" 삭제됨"<<endl;
            break;
            case 3:
                cout<<"Forward List의 첫 번째 요소: ";
                cout<<fl.front()<<endl;
            break;
            case 4:
                cout<<"Forward List의 새 크기 입력: ";
                cin>>n;
                if (n <= fl.max_size())
                    fl.resize(n);
                else
                    fl.resize(n, 0);
            break;
            case 5:
                cout<<"삭제할 값 입력: ";
                cin>>n;
                fl.remove(n);
            break;
            case 6:
                fl.unique();
                cout<<"중복 항목이 삭제되었습니다."<<endl;
            break;
            case 7:
                fl.reverse();
                cout<<"Forward List가 뒤집혔습니다."<<endl;
            break;
            case 8:
                cout<<"Forward List의 요소들: ";
                for (it = fl.begin(); it != fl.end(); it++)
                    cout<<*it<<" ";
                cout<<endl;
            break;
            case 9:
                exit(1);
            break;
            default:
                cout<<"잘못된 선택입니다."<<endl;
        }
    }
return 0;
}

실행 결과

아래는 프로그램을 실행하고 각 메뉴를 차례대로 선택했을 때의 결과입니다. 반복되는 메뉴 출력은 생략하고 핵심 동작만 정리했습니다.

메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 1
메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 2
메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 3
메뉴를 선택하세요: 3
Forward List의 첫 번째 요소: 3
메뉴를 선택하세요: 4
Forward List의 새 크기 입력: 6
메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 1
메뉴를 선택하세요: 5
삭제할 값 입력: 1
메뉴를 선택하세요: 8
Forward List의 요소들: 3 2 0 0 0
메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 4
메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 5
메뉴를 선택하세요: 1
맨 앞에 삽입할 값 입력: 8
메뉴를 선택하세요: 8
Forward List의 요소들: 8 5 4 3 2 0 0 0
메뉴를 선택하세요: 47
잘못된 선택입니다.
메뉴를 선택하세요: 7
Forward List가 뒤집혔습니다.
메뉴를 선택하세요: 8
Forward List의 요소들: 0 0 0 2 3 4 5 8
메뉴를 선택하세요: 4
Forward List의 새 크기 입력: 4
메뉴를 선택하세요: 8
Forward List의 요소들: 0 0 0 2
메뉴를 선택하세요: 9
프로그램 종료

참고 사항

- remove()는 지정한 값과 일치하는 모든 요소를 한 번에 삭제합니다. 위 예제에서 값 1을 삭제하자 두 개의 1이 모두 제거된 것을 확인할 수 있습니다.
- unique()는 서로 인접한 중복 요소만 제거하므로, 정렬되지 않은 리스트의 모든 중복을 없애려면 먼저 sort()를 호출한 뒤 사용하는 것이 좋습니다.
- resize()로 크기를 늘리면 새로 추가되는 자리는 기본값(정수의 경우 0)으로 채워지고, 크기를 줄이면 뒤쪽 요소들이 잘려나갑니다.