이 글에서는 C++ STL의 forward_list::before_begin() 함수의 동작 방식, 문법, 그리고 실제 활용 예제를 자세히 살펴보겠습니다.
STL에서 forward_list란?
forward_list는 시퀀스(sequence) 컨테이너의 일종으로, 시퀀스 내 임의의 위치에서 상수 시간(O(1))에 삽입(insert)과 삭제(erase) 연산을 수행할 수 있는 것이 특징입니다.
forward_list는 내부적으로 단일 연결 리스트(singly-linked list)로 구현되어 있으며, 각 요소가 다음 요소를 가리키는 링크(link)의 연결을 통해 요소들의 순서가 유지됩니다.
forward_list::before_begin()이란?
forward_list::before_begin()은 C++ STL에 내장된 함수로, <forward_list> 헤더 파일에 선언되어 있습니다.
이 함수는 forward_list 컨테이너의 첫 번째 요소 바로 앞 위치를 가리키는 반복자(iterator)를 반환합니다. 단일 연결 리스트 구조의 특성상 맨 앞에 요소를 삽입하려면 '첫 번째 요소 이전' 위치가 필요한데, 이때 before_begin()이 유용하게 사용됩니다.
문법(Syntax)
forwardlist_container.before_begin();
이 함수는 매개변수를 받지 않습니다.
반환 값(Return Value)
시퀀스의 시작 위치 바로 앞을 가리키는 반복자를 반환합니다.
예제 1: before_begin()으로 맨 앞에 요소 삽입하기
아래 코드에서는 forward_list를 생성한 뒤, before_begin() 함수로 첫 번째 요소 앞 위치를 얻고, insert_after() 함수를 사용해 해당 위치에 새로운 요소를 삽입합니다. 실행 결과의 변화를 확인해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
// forward_list 생성 및 초기화
forward_list<int> forwardList = { 3, 6, 1, 2, 4 };
// before_begin() 함수 호출
auto i = forwardList.before_begin();
// forward_list 맨 앞에 요소 삽입
forwardList.insert_after(i, 7);
cout<< "forward_list의 요소들:" << endl;
for (auto j = forwardList.begin(); j != forwardList.end(); ++j)
cout << *j << " ";
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
forward_list의 요소들: 7 3 6 1 2 4
기존 리스트 {3, 6, 1, 2, 4}의 맨 앞에 값 7이 성공적으로 삽입된 것을 확인할 수 있습니다.
예제 2: 한 줄로 간결하게 작성하기
before_begin()과 insert_after()를 한 줄로 연결하여 더욱 간결하게 표현할 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
forward_list<int> forwardList = {2, 23, 12, 11};
forwardList.insert_after(forwardList.before_begin(), 19 );
cout << "forward_list의 요소들: ";
for (auto j = forwardList.begin(); j != forwardList.end(); ++j)
cout << *j << " ";
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
forward_list의 요소들: 19 2 23 12 11
정리
forward_list::before_begin()은 첫 번째 요소 이전 위치를 가리키는 반복자를 반환하는 함수로, 주로 insert_after()와 함께 사용되어 리스트의 맨 앞에 새로운 요소를 삽입하는 용도로 활용됩니다. 단일 연결 리스트 기반인 forward_list의 특성을 이해하고 있다면, 이 함수의 역할을 쉽게 파악할 수 있습니다.