gpt4 book ai didi

c# - C# 中是否有与 IEnumerable 等效的标准 C++?

转载 作者:IT老高 更新时间:2023-10-28 12:32:09 26 4
gpt4 key购买 nike

或者如果 T 的 Enumerator 只是列出所有元素,那么使用 vector 是否安全?

最佳答案

C++ 中不需要它,原因如下:

C# 只支持动态多态。所以要创建一个可重用的算法,你需要一个所有迭代器都将实现的接口(interface)。那是IEnumerator<T> , 和 IEnumerable<T>是一个返回迭代器的工厂。

另一方面,C++ 模板支持鸭子类型。这意味着您不需要通过接口(interface)约束泛型类型参数来访问成员 - 编译器将按名称查找模板的每个单独实例化的成员。

C++ 容器和迭代器具有隐式接口(interface),相当于 .NET IEnumerable<T> , IEnumerator<T> , ICollection<T> , IList<T> ,即:

对于容器:

  • iteratorconst_iterator类型定义
  • begin()成员函数——满足 IEnumerable<T>::GetEnumerator() 的需求
  • end()成员函数 -- 而不是 IEnumerator<T>::MoveNext()返回值

对于前向迭代器:

  • value_type类型定义
  • operator++ -- 而不是 IEnumerator<T>::MoveNext()
  • operator*operator-> -- 而不是 IEnumerator<T>::Current
  • 引用 operator* 的返回类型-- 而不是 IList<T>索引器 setter
  • operator==operator!= -- 在 .NET 中没有真正的等价物,但使用容器的 end()匹配 IEnumerator<T>::MoveNext()返回值

对于随机访问迭代器:

  • operator+ , operator- , operator[] -- 而不是 IList<T>

如果您定义了这些,那么标准算法将适用于您的容器和迭代器。不需要接口(interface),不需要虚函数。不使用虚函数使 C++ 泛型代码比等效的 .NET 代码更快,有时更快。


注意:写泛型算法时,最好使用std::begin(container)std::end(container)而不是容器成员函数。除了 STL 容器之外,这还允许您的算法与原始数组(没有成员函数)一起使用。原始数组和原始指针满足容器和迭代器的所有其他要求,只有一个异常(exception)。

关于c# - C# 中是否有与 IEnumerable<T> 等效的标准 C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764643/

26 4 0