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)으로 채워지고, 크기를 줄이면 뒤쪽 요소들이 잘려나갑니다.