HOWTO · C++
C++에서 목록을 통해 반복
이것은 List 데이터 구조와 C++에서 List 데이터 구조를 반복하는 방법에 대한 쉬운 튜토리얼입니다.
이 페이지의 내용
C++에서 std::list를 순회하려면 begin()으로 반복자를 초기화하고, end()와 다를 동안 각 요소를 처리한 뒤 반복자를 증가시키면 됩니다. 반복자를 역참조하면 현재 값을 읽거나 변경할 수 있습니다. 반복문은 마지막 요소를 가리키는 반복자가 아니라 마지막 요소 다음 위치를 나타내는 표식인 end()에 도달하기 전에 멈춥니다.
C++의 std::list란?
std::list는 C++ 표준 라이브러리의 이중 연결 리스트 컨테이너입니다. 요소는 서로 이웃한 노드와 연결된 상태로 저장되므로 std::vector나 배열의 요소처럼 하나의 연속된 메모리 공간을 차지하지 않습니다. 이 구조에서는 양방향 순회가 가능하며, 해당 위치를 가리키는 반복자를 이미 알고 있다면 그 위치에 요소를 삽입하거나 삭제하는 데 상수 시간이 걸립니다.
리스트는 items[4]와 같은 직접 인덱싱을 제공하지 않습니다. 특정 위치의 요소에 도달하려면 리스트를 따라 반복자를 이동해야 하며, 걸리는 시간은 이동 거리에 비례합니다. 또한 각 요소에는 값뿐 아니라 연결 정보를 저장할 공간도 필요합니다. 반복자의 유효성이 유지되어야 하거나 이미 알고 있는 위치에서 삽입 또는 삭제해야 할 때는 std::list를 선택하세요. 저장 공간을 간결하게 쓰거나 인덱스로 자주 접근해야 한다면 벡터가 더 간단한 선택인 경우가 많습니다.
C++에는 정방향 순회만 지원하는 별도의 단일 연결 컨테이너인 std::forward_list도 있습니다. 이는 std::list와 다른 컨테이너입니다. 자세한 배경은 이중 연결 리스트 문서를 참고하세요.
C++에서 std::list 순회하기
begin()이 반환하는 반복자는 첫 번째 요소를 가리킵니다. end()는 마지막 요소 바로 다음 위치를 가리키므로 반복문의 종료 조건으로 사용하며, 역참조해서는 안 됩니다. 반복자를 증가시키면 다음 요소로 이동합니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
#include <iostream>
#include <list>
int main() {
std::list<int> scores{12, 18, 25};
for (std::list<int>::iterator it = scores.begin(); it != scores.end(); ++it) {
std::cout << *it << '\n';
}
}
12
18
25
여기서 it는 scores.begin()에서 시작합니다. 반복이 한 번 진행될 때마다 *it로 현재 값을 읽고, ++it로 다음 노드로 이동합니다. 반복자가 scores.end()에 도달하면 조건이 거짓이 되므로, 마지막 요소 다음 위치를 읽지 않고 반복문이 끝납니다.
상수가 아닌 반복자를 사용하면 *it에 값을 대입해 요소를 수정할 수 있습니다. 예를 들어 반복문 본문에서 *it += 1;을 실행하면 현재 값이 1 증가합니다. 값만 방문하면 된다면 범위 기반 for 반복문을 사용하세요: for (int score : scores). 이 방식으로 값을 변경하려면 각 항목을 참조로 바인딩합니다: for (int& score : scores). 현재 위치의 요소를 삭제하는 경우처럼 반복자 자체가 필요할 때는 명시적인 반복자 반복문을 사용하세요.
순회 중 요소를 삭제할 때는 erase가 반환한 반복자를 대입해 다음 요소부터 계속 진행하세요. 삭제한 요소를 가리키던 반복자는 무효화되지만, 다른 std::list 요소를 가리키는 반복자는 계속 유효합니다.