std::vector::迭代器在c#中的等价是什么?

本文关键字:是什么 vector 迭代器 std | 更新日期: 2023-09-27 18:10:03

下面的代码片段显示了std::vector c++库中的iterator。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;
      }
    }

std::vector::迭代器在c#中的等价是什么?

c++标准库迭代器的定义方式类似于遍历集合的指针。在c#中,每个实现IEnumerable的集合都可以在foreach循环中迭代。除此之外,你仍然可以使用Enumerator s在c#中做一些类似于c++迭代器的事情(这在大多数情况下使事情变得更加困难):

IEnumerable<int> myCollection = new List<int> { 1, 2, 3 };
var enumerator = myCollection.GetEnumerator();
while(enumerator.MoveNext())
    Console.WriteLine(enumerator.Current);

实际上,上面是foreach循环在底层遍历集合的方式。

foreach(int num in myCollection)
    Console.WriteLine(num);

所以在你的代码中,这是完全等价的(但很难编码和理解):

IEnumerator<KMeanCluster> closest_cluster = clusters.GetEnumerator();
while (closest_cluster.MoveNext())
{
    uint distance_sqr = closest_cluster.Current.GetDistanceSqr(r, g, b);
    if (distance_sqr < distance_sqr_to_closest_cluster)
    {
        distance_sqr_to_closest_cluster = distance_sqr;
        closest_cluster = cluster;
    }
}

,这是最简单的等价:

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

迭代器基本上是一个允许对容器进行串行、非随机访问的对象。无论如何:你可以在c#中使用普通循环。foreach循环在语法上更接近c++的原始

在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,这相当于你的迭代器

通用集合- IEnumerator<T>

支持在泛型集合上进行简单迭代。

非泛型集合- IEnumerator

支持对非泛型集合进行简单迭代。

这些都是接口,应该被继承和覆盖。MoveNextReset等方法。然后你可以在循环中使用这个类。

在c#中有一个iterator结构,但在这种情况下,您不需要直接访问它,而是使用foreach循环。代码可能看起来像这样:

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

内部foreach通过IEnumerable<Cluster>接口访问迭代器