std::vector::迭代器在c#中的等价是什么?
What is the C# equivalent to std::vector::iterators?
下面的代码片段显示了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>
接口访问迭代器
相关文章:
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 向后迭代 std::array 或 std::vector 的正确方法是什么?
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- 最接近"std::atomic<std::vector>"是什么?
- 行 - " vector<int> used(adj.size(), 0); "是什么意思?
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 代码中的"vector<<int>vector>&index"是什么意思?
- 释放 std::vector 中指针内存的最有效方法是什么?
- 这个(const vector<vector<int> > &A)"代码段是什么意思?
- C 11中的标准方法是什么,可以访问std :: vector中元素n的指针
- 当编译器看到 std::vector<Typo> 和 std::vector<struct 拼写错误时发出的诊断之间的差异背后的理由是什么>
- 如果我们可以使用 vector[1] = someInt,emplace() 的目的是什么
- C++中的"vector<type[n]>"是什么?
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- 在OpenCV中,std::vector而不是cv::Mat的"type"是什么解释,我该如何更改它?(C++)
- 复制包含STL成员(如vector)的C++结构的最佳方法是什么
- 这个代码是什么意思 std::vector<cv::P oint2f> points[2]
- 查找语句中的"!=vector.end()"是什么意思?