走査の基本
メニューを表示するにはスワイプしてください
C++標準ライブラリのコンテナでは、begin() および end() メンバ関数が、コンテナの先頭および末尾の次の位置を示すイテレータを提供するために使用されます。
begin() と end() を組み合わせて使用することで、有効な要素範囲を定義します。begin() からのイテレータは最初の要素を指し、end() は最後の要素の直後の位置を示し、有効なデータを参照しません。この半開区間 [begin(), end()) にはすべての要素が含まれ、アルゴリズムが無効なメモリにアクセスせずにイテレーションの終了を検出できます。
main.cpp
123456789101112131415#include <iostream> #include <list> int main() { std::list<int> numbers = {10, 20, 30, 40, 50}; // Iterator 'it' starts at begin(), will stop at end() for (auto it = numbers.begin(); it != numbers.end(); ++it) { // Safe to dereference 'it' here: it points to a valid element std::cout << *it << " "; std::cout << std::endl; // Note: 'it' never equals end() inside the loop body }
この例では、イテレータを使用した典型的な走査パターンを示しています。ループはイテレータを begin() で開始し、イテレータが end() と等しくない限り継続します。ループ内では、イテレータの参照外しは常に安全であり、有効な要素を指しています。イテレータはループ本体内で end() と等しくなることはなく、コンテナに属さないメモリへのアクセスを防ぎます。このループ構造は重要であり、実際にコンテナ内に存在する要素のみをアクセスし、末尾を越えて読み取ることがないようにします。
main.cpp
12345678910#include <iostream> #include <list> int main() { std::list<int> numbers = {100, 200, 300}; auto it = numbers.end(); // 'it' points one past the last element // Mistakenly trying to dereference end() - undefined behavior! std::cout << *it << std::endl; // This is a common mistake }
end() が返すイテレータを参照外しすると、未定義動作が発生します。end() は有効な要素を指していないため、プログラムがクラッシュしたり予測不能な結果を招く可能性があります。包含/非包含境界パターン [begin(), end()) により、有効な要素のみがアクセスされることが保証されます。最初の例はこのルールに従っていますが、2番目の例は end() の排他的境界を無視した場合に何が起こるかを示しています。
[begin(), end()) イテレーションパターンは、std::vector、std::list、std::deque、std::set など、イテレータをサポートするすべての標準ライブラリコンテナで一貫しています。これにより、どのコンテナ型にも対応する汎用的なコードの記述が容易になります。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください