Rob*_*cks 2 c# c++ iterator vector
以下代码段显示iterator了std::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;
}
}
Run Code Online (Sandbox Code Playgroud)
C++标准库迭代器的定义方式类似于遍历集合的指针.在C#中,每个实现的集合IEnumerable都可以foreach循环迭代.除此之外,你仍然可以在C#中使用Enumerators 做类似于C++迭代器的东西(这在大多数情况下会使事情变得更难):
IEnumerable<int> myCollection = new List<int> { 1, 2, 3 };
var enumerator = myCollection.GetEnumerator();
while(enumerator.MoveNext())
Console.WriteLine(enumerator.Current);
Run Code Online (Sandbox Code Playgroud)
实际上,上面是一个foreach循环如何遍历引擎盖下的集合.
foreach(int num in myCollection)
Console.WriteLine(num);
Run Code Online (Sandbox Code Playgroud)
因此,就您的代码而言,这是完全(但难以编码和理解)的等价物:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是最简单的等价物:
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;
}
}
Run Code Online (Sandbox Code Playgroud)