2

私の質問はMaya C++ APIの例を参照していますが、それが Maya に固有のものなのか、それとも一般的な C++ イディオムなのか疑問に思っています。

Maya API にはMSelectionList、シーン内のオブジェクトを表すコンテナである というオブジェクトがあります。MItSelectionListインスタンスのイテレータであるコンパニオンもありMSelectionListます。

これで、イテレーターの利点は、オブジェクトを適切にループする方法を知ることであることがわかりましたが、この場合、インデックスを提供することを除いMSelectionList.length()、イテレーターと同じメソッドと同じゲッターがあります。

例...

MSelectionList

MSelectionList activeList;
MGlobal::activeSelectionList(activeList);

unsigned int length = activeList.length();
for (unsigned int i=0 ; i < length; i++ ) {
    MDagPath item;
    iter.getDagPath(i, item);
}

MItSelectionList

MSelectionList activeList;
MGlobal::activeSelectionList(activeList);
MItSelectionList iter( activeList );

for ( ; !iter.isDone(); iter.next() ) {
    MDagPath item;
    iter.getDagPath(item);
}

イテレータが通常の選択オブジェクトに対して提供する唯一の機能は、フィルタ タイプを設定する機能です。これにより、フィルタに一致するオブジェクトのみが返されます。最初の例では、これと同じテストを明示的に実行できますが。

私の質問は、イテレータと元のオブジェクトの間の機能にこのような重複がある場合、イテレータの利点は何でしょうか? これは単なる Maya 固有の設計上の決定ですか、それとも、ここでは理解できない特別な理由で常にイテレータを作成するのが一般的な C++ のイディオムですか。

4

1 に答える 1

2

私はMayaに精通していませんが、この質問は「イテレータとインデックス作成」の間の議論に関連していると思います。

イテレータに関するウィキペディアの記事によると、イテレータには次の利点があります。

  • カウントループは、すべてのデータ構造、特にリストやツリーのようにランダムアクセスがないか遅いデータ構造には適していません。
  • イテレータは、あらゆる種類のデータ構造を反復処理するための一貫した方法を提供できるため、コードをより読みやすく、再利用可能にし、データ構造の変更に対する感度を低くすることができます。
  • イテレータは、要素をスキップできないようにしたり、以前にアクセスした要素に2回アクセスできないようにするなど、アクセスに追加の制限を適用できます。
  • イテレータを使用すると、イテレータを無効にすることなく、コンテナオブジェクトを変更できます。たとえば、イテレータが最初の要素を超えて進むと、コンテナの先頭に追加の要素を挿入して、予測可能な結果を​​得ることができる場合があります。インデックス付けでは、インデックス番号を変更する必要があるため、これには問題があります。

あなたの特定の例では、要素がスキップされないように強制MItSelectionListするメンバー関数のみを公開しているため、3番目の箇条書きが最も適切であるように見えます(フィルターが適用されていない場合)。next()

于 2012-08-09T01:49:46.750 に答える