Menu
Coddy logo textTech

반복자

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 72번째.

Iterators는 컨테이너와 알고리즘 사이의 다리 역할을 하는 객체입니다. 컨테이너가 내부적으로 데이터를 저장하는 방식과 관계없이 모든 컨테이너의 요소에 접근할 수 있는 일관된 방법을 제공합니다. iterator를 컨테이너를 이동하는 방법을 알고 있는 일반화된 포인터라고 생각해 보세요.

모든 STL 컨테이너는 begin()end() 메서드를 제공합니다. begin() 반복자는 첫 번째 원소를 가리키고, end()는 마지막 원소 다음을 가리킵니다. 즉, 중지할 위치를 표시하는 센티널입니다:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums = {10, 20, 30};
    
    for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        std::cout << *it << " ";  // 값을 얻기 위해 역참조
    }
    // 출력: 10 20 30
}

auto 키워드는 iterator 선언을 크게 간소화합니다:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // 이터레이터를 통해 요소 수정
}
// nums는 이제 {20, 40, 60}

반복자는 기능에 따라 다양한 범주로 나뉩니다. 임의 접근 반복자(vector와 같은 반복자)는 it + 3 또는 it1 - it2와 같은 산술 연산을 지원합니다.

양방향 반복자(list, map에서)는 ++--를 사용하여 앞뒤로 이동할 수 있습니다. Forward 반복자는 한 방향으로만 이동할 수 있습니다.

역방향 순회를 위해 rbegin()rend()를 사용하세요:

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // 역순으로 출력합니다
}
challenge icon

챌린지

쉬움

이터레이터를 사용하여 items 컬렉션을 순회하고 조작하는 inventory 추적 시스템을 만들어 봅시다. 다양한 방식으로 data를 탐색하기 위해 여러 iterator 유형을 사용하는 연습을 하게 됩니다.

코드를 두 파일에 나누어 구성합니다.

  • Inventory.h: std::vector<int>에 저장된 item 수량 컬렉션을 관리하는 Inventory class를 Define합니다.

    class는 다음 메서드를 제공해야 합니다.

    • addItem(int quantity): inventory에 item 수량을 추가합니다.
    • printForward(): begin()end()와 함께 iterator를 사용하여 모든 수량을 공백으로 구분해 출력한 다음 newline을 출력합니다.
    • printReverse(): rbegin()rend()와 함께 reverse iterator를 사용하여 모든 수량을 역순으로 공백으로 구분해 출력한 다음 newline을 출력합니다.
    • doubleAll(): iterator를 사용하여 vector를 순회하며 각 수량을 제자리에서 두 배로 만듭니다.
    • getTotal(): iterator를 사용하여 모든 수량의 합을 계산하고 반환합니다.

    코드를 깔끔하게 유지하려면 iterator 선언에 auto keyword를 사용하세요.

  • main.cpp: item 수량을 나타내는 네 개의 integer inputs를 읽습니다. 각 input은 별도의 줄에 있습니다.

    Inventory를 Create하고 네 수량을 모두 추가합니다. 그런 다음 다음과 같이 iterator 사용을 보여 줍니다.

    1. Forward:를 출력한 followed printForward() 호출
    2. Reverse:를 출력한 followed printReverse() 호출
    3. getTotal()을 사용하여 Total: <sum> 출력
    4. 수량을 Modify하기 위해 doubleAll() 호출
    5. After doubling:을 출력한 followed printForward() 호출
    6. getTotal()을 사용하여 New total: <sum> 출력

예를 들어 inputs가 10, 25, 15, 30인 경우:

Forward: 10 25 15 30 
Reverse: 30 15 25 10 
Total: 80
After doubling: 20 50 30 60 
New total: 160

이 challenge를 통해 iterator를 사용하여 elements를 읽는 방법(출력 및 합계 계산)과 iterator를 사용하여 elements를 Modify하는 방법(두 배로 만들기)을 모두 연습할 수 있습니다. 또한 reverse iterator를 사용하면 index를 조작하지 않고도 backward traversal을 간단하게 수행할 수 있다는 점을 확인할 수 있습니다.

직접 해보기

#include <iostream>
#include "Inventory.h"

using namespace std;

int main() {
    // 네 개의 정수 입력을 읽기
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: Inventory 객체를 생성

    // TODO: 네 개의 수량을 모두 Inventory에 추가

    // TODO: "Forward: "를 출력한 다음 printForward()를 호출

    // TODO: "Reverse: "를 출력한 다음 printReverse()를 호출

    // TODO: "Total: " 뒤에 getTotal()의 결과를 출력

    // TODO: doubleAll()을 호출하여 수량을 수정

    // TODO: Print "After doubling: " then call printForward()

    // TODO: "New total: " 뒤에 getTotal()의 결과를 출력

    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C++ 컴파일러