반복자
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 << " "; // 역순으로 출력합니다
}챌린지
쉬움이터레이터를 사용하여 items 컬렉션을 순회하고 조작하는 inventory 추적 시스템을 만들어 봅시다. 다양한 방식으로 data를 탐색하기 위해 여러 iterator 유형을 사용하는 연습을 하게 됩니다.
코드를 두 파일에 나누어 구성합니다.
Inventory.h:std::vector<int>에 저장된 item 수량 컬렉션을 관리하는Inventoryclass를 Define합니다.class는 다음 메서드를 제공해야 합니다.
addItem(int quantity): inventory에 item 수량을 추가합니다.printForward():begin()및end()와 함께 iterator를 사용하여 모든 수량을 공백으로 구분해 출력한 다음 newline을 출력합니다.printReverse():rbegin()및rend()와 함께 reverse iterator를 사용하여 모든 수량을 역순으로 공백으로 구분해 출력한 다음 newline을 출력합니다.doubleAll(): iterator를 사용하여 vector를 순회하며 각 수량을 제자리에서 두 배로 만듭니다.getTotal(): iterator를 사용하여 모든 수량의 합을 계산하고 반환합니다.
코드를 깔끔하게 유지하려면 iterator 선언에
autokeyword를 사용하세요.main.cpp: item 수량을 나타내는 네 개의 integer inputs를 읽습니다. 각 input은 별도의 줄에 있습니다.Inventory를 Create하고 네 수량을 모두 추가합니다. 그런 다음 다음과 같이 iterator 사용을 보여 줍니다.Forward:를 출력한 followedprintForward()호출Reverse:를 출력한 followedprintReverse()호출getTotal()을 사용하여Total: <sum>출력- 수량을 Modify하기 위해
doubleAll()호출 After doubling:을 출력한 followedprintForward()호출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;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러