入力イテレータと出力イテレータ
メニューを表示するにはスワイプしてください
入力イテレータと出力イテレータは、ストリームやファイルなどでの逐次的な読み取りや書き込みに使用される単一通過イテレータ。入力イテレータは要素を一度に一つずつ読み取り、出力イテレータは書き込みを行い、一度進めると元に戻ることはできない。
入力イテレータと出力イテレータは、ストリームやデバイスなど一度しか走査できないデータソースで使用される単一通過イテレータ。前方にのみ進み、std::cinからの読み取りやstd::coutへの書き込みなど、線形ストリーム処理に最適。イテレータアダプタを利用して操作する。
main.cpp
123456789101112131415161718#include <iostream> #include <iterator> #include <vector> #include <algorithm> int main() { std::cout << "Enter integers (end with non-integer): "; std::istream_iterator<int> input_it(std::cin); std::istream_iterator<int> end_it; std::vector<int> numbers(input_it, end_it); std::cout << "Numbers entered: "; std::ostream_iterator<int> output_it(std::cout, " "); std::copy(numbers.begin(), numbers.end(), output_it); std::cout << std::endl; }
上記のコードでは、入力イテレータと出力イテレータがストリームによる単一パストラバーサルを示しています。
std::istream_iterator<int>は、std::cinから整数を読み取り、非整数が現れるまで進みます。各値はイテレータが進むごとに一度だけ読み取られます。std::vectorの範囲コンストラクタは、イテレータから利用可能なすべての入力を消費し、すでに読み取られた値は再訪できないことを示します。std::ostream_iterator<int>は、各要素をスペースで区切ってstd::coutに書き込みます。- 出力イテレータは書き込みごとに進み、すでに書き込まれた要素を変更または再訪できません。
main.cpp
1234567891011121314151617181920212223#include <iostream> #include <iterator> #include <sstream> int main() { std::istringstream iss("10 20 30"); std::istream_iterator<int> it(iss); std::istream_iterator<int> end; if (it != end) { std::cout << "First value: " << *it << std::endl; ++it; } // Attempt to go back to the first element (not possible) // The following line would try to dereference the advanced iterator if (it != end) std::cout << "Second value: " << *it << std::endl; // Attempting to re-read the first element is not possible // Input iterators do not support multi-pass traversal }
この例は、入力イテレータの主な制限を示しています。要素を読み取りイテレータを進めると、その要素には戻れません。イテレータはストリームを前方に進み、すでに読み取られた値は再訪できません。この単一パスの動作が、入力イテレータと出力イテレータの特徴です。対照的に、フォワードイテレータやランダムアクセスイテレータなどのイテレータ型は、複数回のパスや要素の再訪が可能です。入力イテレータや出力イテレータを使用する場合、各要素が一度だけアクセスされることを前提にアルゴリズムを設計する必要があります。
一部のSTLアルゴリズムのみが入力イテレータおよび出力イテレータで動作します。複数回の走査や要素の並べ替えを必要とするアルゴリズムは、通常、前方イテレータ、双方向イテレータ、またはランダムアクセスイテレータが必要です。例えば、std::copyは入力イテレータから読み取ることができますが、std::sortはランダムアクセスイテレータが必要です。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください