Menu
Coddy logo textTech

イテレータ

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 72/104。

イテレータは、コンテナとアルゴリズムの間の橋渡しをするオブジェクトです。コンテナが内部でデータをどのように格納しているかに関係なく、任意のコンテナ内の要素にアクセスするための統一された方法を提供します。イテレータは、コンテナ内を移動する方法を知っている汎用化されたポインタだと考えてください。

すべてのSTLコンテナには、begin()メソッドとend()メソッドがあります。begin()イテレータは最初の要素を指し、end()は最後の要素の1つ先を指します。これは停止位置を示すセンチネルです:

#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キーワードを使うと、イテレーターの宣言が大幅に簡単になります。

for (auto it = nums.begin(); it != nums.end(); ++it) {
    *it *= 2;  // イテレータを通じて要素を変更する
}
// nums は現在 {20, 40, 60}

イテレーターは、その機能に基づいてさまざまなカテゴリに分類されます。ランダムアクセスイテレーターvectorなど)は、it + 3it1 - it2のような算術演算をサポートします。

双方向イテレーターlistmapの)は、++--を使って前後に移動できます。Forward iteratorsは一方向にしか移動できません。

逆方向の走査には、rbegin()rend() を使用します:

for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
    std::cout << *rit << " ";  // 逆順に出力します
}
challenge icon

チャレンジ

簡単

イテレータを使用して item のコレクションを走査および操作する inventory 追跡システムを構築しましょう。さまざまな方法で data 内を移動するために、異なる種類のイテレータを使用する練習をします。

コードを2つのファイルに分けて整理します。

  • Inventory.h: std::vector<int> に格納された item の数量のコレクションを管理する Inventory class を define します。

    class には次のメソッドを用意します。

    • addItem(int quantity): item の数量を inventory に追加します
    • printForward(): begin()end() を使用するイテレータで、すべての数量をスペース区切りで出力し、その後に改行を出力します
    • printReverse(): rbegin()rend() を使用する逆イテレータで、すべての数量を逆順にスペース区切りで出力し、その後に改行を出力します
    • doubleAll(): イテレータを使用して vector を走査し、各数量をその場で2倍にします
    • getTotal(): イテレータを使用してすべての数量の合計を計算し、返します

    コードを簡潔に保つため、イテレータの宣言には auto keyword を使用します。

  • main.cpp: item の数量を表す4つの整数入力を読み込みます(それぞれ別の行に入力されます)。

    Inventory を Create して4つすべての数量を追加します。その後、次の操作を行ってイテレータの使用方法を示します。

    1. Forward: を出力してから printForward() を呼び出す
    2. Reverse: を出力してから printReverse() を呼び出す
    3. getTotal() を使用して Total: <sum> を出力する
    4. 数量を Modify するために doubleAll() を呼び出す
    5. After doubling: を出力してから printForward() を呼び出す
    6. getTotal() を使用して New total: <sum> を出力する

たとえば、入力が 10251530 の場合:

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

この challenge では、イテレータを介して要素を読み取る操作(出力や合計の計算)と、イテレータを介して要素を Modify する操作(2倍にする処理)の両方を練習できます。また、逆イテレータを使うと、インデックスを操作しなくても後方への走査を簡単に行えることも確認できます。

自分で試してみよう

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

using namespace std;

int main() {
    // 4つの整数入力を読み取る
    int q1, q2, q3, q4;
    cin >> q1;
    cin >> q2;
    cin >> q3;
    cin >> q4;

    // TODO: Inventoryオブジェクトを作成する

    // TODO: 4つの数量すべてをインベントリに追加する

    // 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++オンラインコンパイラ