2

次のコード スニペットはiteratorstd::vectorC++ ライブラリの を示しています。これに相当するC#は何ですか? リンクされたリストではないことを考慮して、ベクトル内の各項目を単純にループできますか? ここでイテレータは正確に何をしているのですか?C#で同等のことを行うにはどうすればよいですか? 完全なコードはこちらです。

 std::vector<KMeanCluster>::iterator closest_cluster = clusters.begin();

    // Figure out which cluster this color is closest to in RGB space.
    for (std::vector<KMeanCluster>::iterator cluster = clusters.begin();
        cluster != clusters.end(); ++cluster) {
      uint distance_sqr = cluster->GetDistanceSqr(r, g, b);

      if (distance_sqr < distance_sqr_to_closest_cluster) {
        distance_sqr_to_closest_cluster = distance_sqr;
        closest_cluster = cluster;
      }
    }
4

5 に答える 5

2

イテレータは基本的に、コンテナへのシリアルで非ランダムなアクセスを可能にするオブジェクトです。とにかく: C# では通常のループを使用できます。foreach ループは、構文的に C++ の元のループに少し近い

于 2013-04-18T12:27:10.613 に答える
2

C# では、これは次のようになります。

var closest_cluster = clusters.FirstOrDefault();
foreach (var cluster in clusters)
{
    uint distance_sqr = cluster.GetDistanceSqr(r, g, b);
    if (distance_sqr < distance_sqr_to_closest_cluster)
    {
        distance_sqr_to_closest_cluster = distance_sqr;
        closest_cluster = cluster;
    }
}

foreach演算子が行うことは、その下で使用されることでありIEnumerator、これはイテレータと同等です。

于 2013-04-18T12:28:01.247 に答える
2

汎用コレクション -IEnumerator<T>

ジェネリック コレクションに対する単純な反復をサポートします。

非ジェネリック コレクション -IEnumerator

非ジェネリック コレクションに対する単純な反復をサポートします。

これらはインターフェースであり、継承してオーバーライドする必要があります。MoveNextやなどの方法Reset。次に、そのクラスをループで使用できます。

于 2013-04-18T12:29:16.410 に答える
1

C# にはiteratorコンストラクトがありますが、この場合は直接アクセスする必要はなく、代わりにforeachループを使用します。コードは次のようになります。

Cluster closestCluster = clusters.firstOrDefault();

foreach (Cluster currentCluster in clusters)
{
   //Distance logic
   if (distanceSqr < distanceSqrToClosestCluster)
   {
        closestCluster = currentCluster;
   }
}

内部的には、インターフェイスforeachを介してイテレータにアクセスしますIEnumerable<Cluster>

于 2013-04-18T12:31:43.720 に答える