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;
}
}
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
支持对非泛型集合进行简单迭代。
这些都是接口,应该被继承和覆盖。MoveNext
、Reset
等方法。然后你可以在循环中使用这个类。
在c#中有一个iterator
结构,但在这种情况下,您不需要直接访问它,而是使用foreach
循环。代码可能看起来像这样:
Cluster closestCluster = clusters.firstOrDefault();
foreach (Cluster currentCluster in clusters)
{
//Distance logic
if (distanceSqr < distanceSqrToClosestCluster)
{
closestCluster = currentCluster;
}
}
内部foreach
通过IEnumerable<Cluster>
接口访问迭代器