이 글에서는 C++ STL의 list::end() 함수가 어떻게 동작하는지, 어떤 문법으로 사용하는지, 그리고 실제 코드 예제를 통해 자세히 알아보겠습니다.
STL에서 리스트(List)란 무엇인가?
리스트는 시퀀스 내 어느 위치에서든 상수 시간(O(1)) 안에 삽입과 삭제를 수행할 수 있는 자료구조입니다. 리스트는 내부적으로 이중 연결 리스트(doubly linked list)로 구현되어 있으며, 비연속적인 메모리 할당을 허용합니다.
배열(array), 벡터(vector), 덱(deque)과 비교했을 때, 리스트는 컨테이너 내 임의의 위치에 요소를 삽입·추출·이동하는 작업에서 훨씬 뛰어난 성능을 보여줍니다. 다만 인덱스를 통한 직접 접근 속도는 느린 편입니다. 리스트는 forward_list와 비슷하지만, forward_list는 단일 연결 리스트(singly linked list)로 구현되어 있어 앞쪽 방향으로만 순회할 수 있다는 차이가 있습니다.
list::end()란 무엇인가?
list::end()는 C++ STL에 내장된 함수로, <list> 헤더 파일에 선언되어 있습니다. end()는 리스트 컨테이너의 마지막 요소 바로 다음 위치를 가리키는 반복자(iterator)를 반환합니다. 즉, 이 반복자는 컨테이너 내부의 어떤 유효한 요소도 가리키지 않습니다.
이 함수는 주로 list::begin()과 함께 사용되어, 특정 리스트 컨테이너의 전체 범위(range)를 지정하는 용도로 활용됩니다.
문법(Syntax)
list_container.end();
이 함수는 별도의 매개변수를 받지 않습니다.
반환 값(Return Value)
이 함수는 리스트 컨테이너의 마지막 요소 다음(past-the-end) 위치를 가리키는 반복자를 반환합니다.
예제 1: begin()과 end()로 리스트 순회하기
아래 코드에서는 end() 함수를 begin() 함수와 함께 사용하여 리스트에 저장된 모든 요소를 처음부터 끝까지 순회합니다.
#include <bits/stdc++.h>
using namespace std;
int main(){
// 리스트 생성
list<int> myList;
// push_back() 함수로 리스트에 요소 삽입
myList.push_back(67);
myList.push_back(12);
myList.push_back(32);
myList.push_back(780);
myList.push_back(78);
cout<<"elements in the list are :\n";
for (auto j = myList.begin(); j!= myList.end(); j++){
cout << *j << " ";
}
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Elements in the list are: 67 12 32 780 78
예제 2: 배열 값을 리스트로 옮겨 순회하기
아래 코드에서는 배열에 담긴 값들을 리스트에 삽입한 후, end() 함수가 반환하는 반복자를 활용해 리스트의 모든 요소를 출력합니다.
#include <iostream>
#include <list>
int main (){
// 요소를 담은 배열 생성
int values[] = {67, 12, 32, 780, 78};
// 배열의 값들을 리스트에 삽입
std::list<int> myList (values,values+5);
std::cout << "elements in the list are :\n";
// end() 함수가 반환한 반복자로 리스트 요소 접근
for (std::list<int>::iterator i = myList.begin() ; i != myList.end(); ++i)
std::cout << ' ' << *i;
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Elements in the list are: 67 12 32 780 78