タグ付けされた質問 「iterator」

4
Pythonのイテレータが例外を発生させるのはなぜですか?
Javaの反復子の構文は次のとおりです(C#の構文に似ています)。 Iterator it = sequence.iterator(); while (it.hasNext()) { System.out.println(it.next()); } 理にかなっています。Pythonの同等の構文は次のとおりです。 it = iter(sequence) while True: try: value = it.next() except StopIteration: break print(value) 例外は、例外的な状況でのみ使用されることになっていると思いました。 Pythonが例外を使用して反復を停止するのはなぜですか?

6
Pythonがリストを繰り返すときに個々の要素のコピーのみを作成するのはなぜですか?
Pythonで次のように書けば for i in a: i += 1 a変数iはの元の要素のコピーであることが判明したため、元のリストの要素は実際にはまったく影響しませんa。 元の要素を変更するには、 for index, i in enumerate(a): a[index] += 1 必要になります。 この振る舞いには本当に驚きました。これは非常に直感に反し、他の言語とは一見異なるように思われ、今日は長い間デバッグしなければならなかったコードにエラーが生じました。 以前にPythonチュートリアルを読んだことがあります。念のため、この本をもう一度チェックしましたが、この動作についてはまったく言及していません。 この設計の背後にある理由は何ですか?チュートリアルが読者が自然にそれを手に入れるべきであると信じるように、それは多くの言語の標準的な実践であると予想されますか?繰り返しで同じ動作が存在する他の言語は何ですか?将来的に注意する必要がありますか?
31 python  list  iterator 

6
イテレータパターン-内部表現を公開しないことが重要なのはなぜですか?
C#Design Pattern Essentialsを読んでいます。現在、イテレータパターンについて読んでいます。 私は実装方法を完全に理解していますが、重要性を理解していないか、ユースケースを見ていません。この本では、誰かがオブジェクトのリストを取得する必要がある例を示しています。IList<T>またはなどのパブリックプロパティを公開することでこれを行うことができますArray。 本は書いている これに伴う問題は、これら両方のクラスの内部表現が外部プロジェクトに公開されていることです。 内部表現とは何ですか?実際にはそれがありますarrayかIList<T>?消費者(これを呼び出しているプログラマー)がこれを知るのが悪い理由が本当にわかりません... この本は、このパターンが機能を公開することでGetEnumerator機能するため、GetEnumerator()この方法で「リスト」を呼び出して公開できると述べています。 特定の状況では、このパターンには(すべてのように)場所があると思いますが、どこで、いつ見るかわかりません。

1
単体テスト:Linqによるアサーションの遅延
このような遅延アサーションを追加しても大丈夫ですか var actualKittens = actualKittens.Select(kitten => { Assert.IsСute(kitten); return kitten }); どうして?そのため、たとえば実体化されたコレクションを期待するステートメントでも、一度だけ反復できます。 CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList()); また、Selectだけでなく、イテレータが定義され、多くのチェックとロジック(たとえば、いくつかのカウントとフィルタリング)を持つメソッドでもあります。 疑いの種は、テストが失敗した場合にそのようなコードを読み取り、デバッグする複雑さです。

1
関数型プログラミングでジェネレーター関数は有効ですか?
質問は次のとおりです。 ジェネレーターは関数型プログラミングのパラダイムを壊しますか?なぜですか? はいの場合、ジェネレーターを関数型プログラミングで使用できますか? 以下を考慮してください。 function * downCounter(maxValue) { yield maxValue; yield * downCounter(maxValue > 0 ? maxValue - 1 : 0); } let counter = downCounter(26); counter.next().value; // 26 counter.next().value; // 25 // ...etc downCounterこの方法は、ステートレス表示されます。同様に、downCounter同じ入力で呼び出すと、常に同じ出力になります。ただし、同時に、呼び出しnext()は一貫した結果を生成しません。 この例でcounterはジェネレーターオブジェクトであるため、ジェネレーターが関数型プログラミングパラダイムを破るかどうかはわかりません。そのため、呼び出しnext()はまったく同じで作成された別のジェネレーターオブジェクトと同じ結果を生成しますmaxValue。 同様someCollection[3]に、配列を呼び出すと、常に4番目の要素が返されます。同様next()に、ジェネレーターオブジェクトで4回呼び出すと、常に4番目の要素が返されます。 より多くのコンテキストについては、これらの質問は、プログラミングカタの作業中に提起されました。質問に答えた人は、関数型プログラミングでジェネレーターを使用できるかどうか、およびジェネレーターが状態を保持するかどうかという質問を提起しました。

4
イテレーターには非破壊的な暗黙の契約がありますか?
スタックやキューなどのカスタムデータ構造を設計しているとしましょう(たとえば、論理的に同等なメソッドpushやpop破壊的なアクセサーメソッドを持つ他の任意の順序付きコレクションなど)。 IEnumerable<T>各反復でポップされたこのコレクションに対して(具体的には.NETで)イテレータを実装している場合、それはブレークIEnumerable<T>の暗黙のコントラクトですか? IEnumerable<T>この暗黙の契約を持っていますか? 例えば: public IEnumerator<T> GetEnumerator() { if (this.list.Count > 0) yield return this.Pop(); else yield break; }

4
C ++イテレーター、すべてのイテレーターが継承するイテレーター基本クラスがないのはなぜですか
私は試験に向けて学習しており、質問と回答に苦労しています。 なぜ他のすべてのイテレータが継承するイテレータ基本クラスが存在しないのですか? 私の先生はcppリファレンス " http://prntscr.com/mgj542 " の階層構造を参照していると思います。なぜそれらを使用する必要があるのか​​、他の理由を提供する必要がありますか? イテレータの種類(種類)と、コンテナの操作に使用されることを知っています。たとえば、基盤となるデータ構造が異なる可能性があるため、配列にはランダムにアクセスできますが、リンクリストにはアクセスできないため、コンテナーごとに異なるイテレーターがあり、コンテナーごとに移動方法が異なります。 それらはおそらくコンテナに応じて特殊化されたテンプレートでしょう。
11 c++  iterator 

2
イテレーターをデザインパターンにする理由
他の同様の構成と比較してIteratorが特別になるのは何だろうと思っていました。そのため、Gang of Fourがデザインパターンとしてリストされています。 イテレーターは、ポリモーフィズム(共通のインターフェースを持つコレクションの階層)と懸念の分離(コレクションの反復は、データの構造化方法から独立している必要があります)に基づいています。 しかし、コレクションの階層を、たとえば数学オブジェクト(整数、浮動小数点数、複素数、行列など)の階層と反復子を、これらのオブジェクトの関連するいくつかの操作を表すクラス(例えば、指数関数)で置き換えるとどうなるでしょうか。クラス図も同じです。 同じように機能する、Writer、Painter、Encoderなどのより多くの類似の例、おそらくより優れた例を見つけることができます。しかし、これらがデザインパターンと呼ばれるのを聞いたことがありません。 では、イテレータが特別な理由は何ですか? コレクション内の現在の位置を格納するために変更可能な状態を必要とするため、より複雑になるのは事実ですか?しかし、その場合、変更可能な状態は通常望ましいとは見なされません。 私のポイントを明確にするために、より詳細な例を挙げましょう。 ここに私たちの設計問題があります: クラスの階層と、これらのクラスのオブジェクトに対して定義された操作があるとします。この操作のインターフェースは各クラスで同じですが、実装は完全に異なる場合があります。同じオブジェクトに複数の操作を適用すること、たとえば異なるパラメーターを使用することが理にかなっていることも想定されています。 これが私たちの設計問題(実際には反復子パターンの一般化)の賢明な解決策です: 懸念を分離するために、操作の実装を関数として元のクラス階層(オペランドオブジェクト)に追加しないでください。同じオペランドに操作を複数回適用する必要があるため、関数だけでなく、オペランドへの参照を保持するオブジェクトで表す必要があります。したがって、オペランドオブジェクトは、演算を表すオブジェクトを返す関数を提供する必要があります。このオブジェクトは、実際の操作を実行する関数を提供します。 例: MathObject派生クラスMyIntegerとを備えた基本クラスまたはインターフェイス(愚かな名前です。たぶん誰かがより良いアイデアを持っています。)がありMyMatrixます。それぞれについて、正方形、立方体などの計算を可能にMathObjectする操作Powerを定義する必要があります。だから私たちは(Javaで)書くことができました: MathObject i = new MyInteger(5); Power powerOfFive = i.getPower(); MyInteger square = powerOfFive.calculate(2); // should return 25 MyInteger cube = powerOfFive.calculate(3); // should return 125

1
JavaのIteratorとListIteratorが要素間を指すのはなぜですか?
ListIteratorのJavadocは次のように述べています。 AにListIteratorは現在の要素がありません。カーソル位置は常に、への呼び出しによって返されるprevious()要素とへの呼び出しによって返される要素の間にありますnext()。 Java ListIteratorが現在の要素ではなく要素間を指すように実装されたのはなぜですか?繰り返し呼び出す必要があるとき、これはクライアントコードが読みにくくなりますようだgetNext()、getPrevious()私は選択のための正当な理由がなければならないと仮定して、。 注意点として、私はちょうど書いたpeekable-のArrayListと呼ばれる小さなライブラリ拡張ArrayList、IteratorおよびListIteratorその提供peekAtNext()とpeekAtPrevious()同じように実装する方法を: @Override public synchronized T peekAtNext() { T t = next(); previous(); return t; }
9 java  iterator 

2
次のイテレーターがこのイテレーターより優れている点は何ですか?
私はJava / C#イテレータを直接操作することはあまりありませんが、「次の」方法でイテレータを設計する理由は何だろうといつも思っています。 開始するには、イテレータを移動する必要があります。データがあるかどうかを確認するには、次の要素があるかどうかを確認する必要があります。 私にとってより魅力的なコンセプトはthis-iteratorです。これは最初から「始まる」ので、この状態を確認できるとしましょうisValid。したがって、コレクション全体のループは次のようになります。 while (iter.isValid()) { println(iter.current()); iter.next(); } ここで次の要素があるかどうかを確認するために、そこに行き、状態が有効かどうかを確認します。 YMMVですが、とにかく-このイテレーターよりも次のイテレーター(Java / C#など)の利点はありますか? 注:これは、言語の設計に関する概念的な質問です。
8 c#  java  iterator 

4
C ++イテレーターの存続期間と無効化の検出
C ++ 11の慣用的なものに基づいて: カスタムコンテナーへのイテレーターは、コンテナー自体が破棄されても存続しますか? イテレータが無効になったときにそれを検出することは可能でしょうか? 上記は「デバッグビルド」を実際に条件としていますか? 詳細:私は最近C ++をブラッシュアップし、C ++ 11の使い方を学びました。その一環として、私はuriparserライブラリーの慣用的なラッパーを作成しています。この一部は、解析されたパスコンポーネントのリンクリスト表現をラップすることです。コンテナーの慣用句についてのアドバイスを探しています。 最近気になるのは、ガベージコレクションされた言語から来ていることですが、ランダムなオブジェクトが、ライフタイムに関して間違いを犯した場合に、ユーザーに表示されなくなるだけではありません。これを説明するために、PathListコンテナとその反復子の両方shared_ptrが実際の内部状態オブジェクトを保持します。これにより、そのデータを指すものが存在する限り、データも存在するようになります。 ただし、STL(および多くの検索)を見ると、C ++コンテナーがこれを保証しているようには見えません。私はこの恐ろしい疑いを抱いており、期待はコンテナーを破壊するだけで、それに伴うイテレーターをすべて無効にすることです。 std::vector確かにイテレータを無効にしても機能するようです。 私が知りたいのは、「良い」/慣用的なC ++ 11コードから何が期待されるかです。光沢のある新しいスマートポインターを考えると、STLを使用すると、誤ってイテレーターをリークして足を簡単に吹き飛ばせるのは奇妙に思えます。shared_ptrバッキングデータを使用することは、不必要な非効率性、デバッグのための良いアイデア、またはSTLが実行しないと予想されることですか? (これを「慣用的なC ++ 11」に接地することで、主観性の訴えが回避されることを願っています...)
8 c++  c++11  idioms  iterator 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.