イテレータ
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 + 3やit1 - it2のような算術演算をサポートします。
双方向イテレーター(list、mapの)は、++と--を使って前後に移動できます。Forward iteratorsは一方向にしか移動できません。
逆方向の走査には、rbegin() と rend() を使用します:
for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
std::cout << *rit << " "; // 逆順に出力します
}チャレンジ
簡単イテレータを使用して item のコレクションを走査および操作する inventory 追跡システムを構築しましょう。さまざまな方法で data 内を移動するために、異なる種類のイテレータを使用する練習をします。
コードを2つのファイルに分けて整理します。
Inventory.h:std::vector<int>に格納された item の数量のコレクションを管理するInventoryclass を define します。class には次のメソッドを用意します。
addItem(int quantity): item の数量を inventory に追加しますprintForward():begin()とend()を使用するイテレータで、すべての数量をスペース区切りで出力し、その後に改行を出力しますprintReverse():rbegin()とrend()を使用する逆イテレータで、すべての数量を逆順にスペース区切りで出力し、その後に改行を出力しますdoubleAll(): イテレータを使用して vector を走査し、各数量をその場で2倍にしますgetTotal(): イテレータを使用してすべての数量の合計を計算し、返します
コードを簡潔に保つため、イテレータの宣言には
autokeyword を使用します。main.cpp: item の数量を表す4つの整数入力を読み込みます(それぞれ別の行に入力されます)。Inventoryを Create して4つすべての数量を追加します。その後、次の操作を行ってイテレータの使用方法を示します。Forward:を出力してからprintForward()を呼び出すReverse:を出力してからprintReverse()を呼び出すgetTotal()を使用してTotal: <sum>を出力する- 数量を Modify するために
doubleAll()を呼び出す After doubling:を出力してからprintForward()を呼び出すgetTotal()を使用してNew total: <sum>を出力する
たとえば、入力が 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 では、イテレータを介して要素を読み取る操作(出力や合計の計算)と、イテレータを介して要素を 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;
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ