-1

Pythonステートメントの最も近い翻訳は何だろうと思っています:

try:

except StopIteration:

私はC++とPythonの両方にかなり慣れていません.3〜4週間ほど経ったと思います. 一般的な if ステートメントが比較的同じ仕事をすることは承知していますが、そのStopIteration部分を複製する方法については確信が持てませんでした。簡単な休憩で十分でしょうか?

編集:コード内

try:
   nextread1=myfile1.next()
   nextread2=myfile2.next()
except StopIteration:
   print("error msg")
   sys.exit(2)
4

2 に答える 2

3

StopIterationPython の特別な例外で、新しい要素を取得しようとしたときに反復子によってスローされますが、それ以上はありません。これが、 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コードは、vectordeque、 、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()

于 2013-10-17T12:37:19.880 に答える