まず、C++ スタイルの反復子を簡単に確認します。例:
//--- Iterating over vector with iterator.
vector<int> v;
. . .
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
柔軟です。基になるコンテナーの種類を簡単に変更できます。たとえば、挿入と削除の数が非常に多いため、ベクトルよりもリストの方が効率的であると後で判断する場合があります。また、多くの便利なメンバー関数もあります。ベクターのメンバー関数の多くは、代入、挿入、消去などの反復子を使用します。さらに、イテレータ (サポートされている場合) を ++ や -- などの双方向で使用できます。これは、オブジェクトのようなストリームを解析するのに役立ちます。
Python の問題点は次のとおりです。 1:現在、Python for ループ構文は c++ for よりも柔軟性がありません。(まあ、より安全です) 2: "it != iter.end()" スタイルではなく、Python は next() がそれ以上ない場合に例外をスローします。柔軟ではありません。
質問 1: 上記の私の考えは正しいですか?
わかった。ここに私の質問があります.C++イテレータと同じくらい強力なより強力なPythonイテレータを実装するにはどうすればよいですか? 現在、python for ループ構文は c++ for より柔軟性がありません。http://www.velocityreviews.com/forums/t684406-pushback-iterator.htmlなど、いくつかの可能な解決策も見つけました。しかし、イテレータに尋ねるのではなく、ユーザーに何かをプッシュバックするように求めます-.
質問 2: Python で Bidirectional Iterator を実装するには何が最適ですか? http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/のように。擬似コードは次のとおりです。
it = v.begin();
while( it!=v.end()) {
//do sth here
if (condition1)
++it;//suppose this iterator supports ++
if(condition2)
--it;//suppose this iterator supports --
}
主な機能は次のとおりです。1) 双方向、2) 単純な「終了」チェック。「++」または「--」演算子または一般的な関数は問題ではありません (とにかく意味的な違いはありません)。
ありがとう、
更新:回答からいくつかの可能な解決策を得ました:
i = 0
while i < len(sequence): # or i < len and some_other_condition
star_it = sequence[i]
if condition_one(star_it):
i += 1
if condition_two(star_it):
i = max(i - 1, 0)
ただし、配列とは異なり、リストのランダム アクセスは O(n) である必要があります。Pythonの「リスト」オブジェクトは、内部的にリンクリストのようなものを使用して実装されていると思います。したがって、この while ループ ソリューションは効率的ではありません。しかし、C++ には「ランダム イテレータ」、「双方向イテレータ」があります。どうすればより良い解決策を得ることができますか? ありがとう。