StopIteration
Python の特別な例外で、新しい要素を取得しようとしたときに反復子によってスローされますが、それ以上はありません。これが、 Python が のようなループを停止するタイミングを検出する方法ですfor x in iterator
。これは基本的に Python で次のように変換されます。
while True:
try: value = next(iterator)
except StopIteration: break
# do something...
ただし、C++ の STL の反復子は大きく異なります。C++ の翻訳をどのレベルで見たいのかわかりません。Python のような同様の反復子がある場合は、コードを 1:1 に変換できる可能性があります。しかし、STL イテレータはこのようには動作しません。次の要素がないときに次の要素を読み込もうとした場合、例外はスローされません。動作はかなり未定義であり、おそらくクラッシュする可能性があります。すべてのコンテナーの STL には、常に特別な終了イテレーター (コンテナーの外側にあります!) があり、イテレーターが終了イテレーターと等しいかどうかを確認します。その場合、それ以上要素を読み取ってはならないことがわかります。これは主に次のようになります。
auto iterator = mylist.begin(); // get the iterator at the start of mylist
while(iterator != mylist.end()) { // check if our iterator is not equal to the end-iterator
auto value = *iterator; // get the value of the iterator
// do something with value
++iterator; // advances the iterator by one
}
Python では 2 つのことを行うことに注意してくださいnext()
。値がある場合、現在の値を返し、反復子を 1 つ進めます。それ以外の場合は、StopIteration
例外が発生します。C++ では、現在の値は を介して返され*iterator
、反復子は によって進められ++iterator
ます。また、C++ では例外がないため、自分でチェックする必要があります (つまりiterator != mylist.end()
)。
これを C++ で記述するためのより短く、より一般的な方法は次のとおりです。
for(auto iterator = mylist.begin(); iterator != mylist.end(); ++iterator) {
auto value = *iterator; // get the value of the iterator
// do something with value
}
または、さらに短く:
for(auto value : mylist) {
// do something with value
}
list
コードは、vector
、deque
、 、set
などのすべての STL コンテナーに対して次のように機能しmultiset
ます。Avector
は、ほとんどの場合、内部の単なる配列です。ただし、C 配列 (例: int numbers[N];
) は最初の 2 つのコード例では機能しません。これはオブジェクトではなく、関数begin()
とend()
関数がないためです。ただし、最後の例はその場合にも機能します。
独自のコンテナ クラスを作成する場合は、上記のコードを次のように機能させるいくつかのbegin()
および関数も実装する必要があります。end()
C++ でのファイルの読み取りもまた異なることに注意してください。Python では、 を使用するfor x in myfile
と、ファイルの行に対してイテレータが自動的に生成され、そのイテレータを使用しています。しかしもちろん、Python でファイルを読み取る他の方法もありますmyfile.read()
。後者には、C で直接同等のものがありfread()
ます。しかし、C/C++ でファイルを読み取るにはさまざまな方法があるため、ここですべての可能性を列挙することはしません。read()
fread()
sys.exit()
C 関数 とほぼ同等exit()
です。ただし、アプリケーションが終了するようreturn
に、すべての関数から、最後にreturn
からの方がよいでしょう。main()