Rust Iterator和C++ Iterator之间的主要区别是什么?

The*_*abu 14 c++ iterator rust

C++迭代器的典型示例是指针,可用于指向C数组中的元素,如下所示:

int array[] = {1, 2, 3, 4};
int* begin = std::begin(array); //Starting iterator
int* end = std::end(array) //Ending iterator

for(int* i = begin; i < end; i++)
{
    std::cout << *i << ',';
}

//Prints 1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)

这很简单.来自cplusplus.com的迭代器的定义是

迭代器是指向一系列元素(例如数组或容器)中的某个元素的任何对象,它能够使用一组运算符迭代该范围的元素...

这是有道理的; 在上面的代码中有两个迭代器(beginend迭代器),它使用一个for循环并递增.

在Rust中,迭代器的使用方式如下:

let vect = vec![1, 2, 3, 4];

let vect_iter = vect.iter();
Run Code Online (Sandbox Code Playgroud)

什么?要迭代它,你可以:

vect_iter.next();
vect_iter.next();
Run Code Online (Sandbox Code Playgroud)

我在Rust文档中找不到任何指针的确切定义,但是看一下该Iterator特性,似乎迭代器是容器的包装器,通过以某种方式标准化逻辑来实现更容易的处理(如果是一点都有意义.

我的主要问题是:

  1. 有哪些主要区别?
  2. 为什么Rust以这种方式拥有迭代器,为什么它们表达方式如此不同?
  3. C++中是否有Rust类型的迭代器?
  4. 是否有C++ - 在Rust中输入迭代器?
  5. 它们被称为具体的东西吗?(内部外部?)

Mat*_* M. 15

迭代器是在编程语言中找到的概念,用于指代允许迭代集合或元素序列的构造.这个概念是故意模糊的,这是一个概念!它没有规定任何具体的实施.

为了更容易区分C++和Rust,我将使用不同的名称:

  • C++迭代器将命名为游标,
  • Rust迭代器将命名为streams.

是的,那些完全是武断的.请注意,如果您查看Java或C#等语言,您会发现它们也使用流.


C++

首先,不要使用cplusplus.com.cppreference.com要好得多.

迭代器是指向一系列元素(例如数组或容器)中的某个元素的任何对象,它能够使用一组运算符迭代该范围的元素...

简单,错误.

游标可以是:

  • 指向一个元素,
  • 或者是单数并且根本不指向任何元素.

通常,奇异值用于表示:

  • 该序列的结束来遍历:vec.end(),
  • 没有元素:std::find(...).

您可以增加光标,有时也可以减少光标.如果你这样做,你通常需要一游标来知道何时停止.

为什么C++使用这样的表示?因为C就是这样做的,它运作得很好......虽然它很容易出错.


Rust努力安全,并且喜欢易于使用的API.这排除了一对游标:

  • 一对游标不安全:你可以轻松迭代越界,你可以获得别名引用,
  • 一对游标容易出错:很容易意外地将游标与两个不同的序列配对.

为了控制边界,别名和避免对不匹配,你必须使用单个对象; 因此类似流的API.

IteratorRust中的API让人联想到Java和C#,虽然Rust通过使用它来改进它,Option<T>使得它不是笨拙hasNext()/ next()调用对,而是提供一种方法next(),它既可以推进流,也可以发出信号.


结论

Rust和C++都有一种迭代元素集合的方法:

  • C++提供类似C的方式,灵活但容易出错,
  • Rust提供现代化的方式,安全但不太灵活.

两种语言都提供外部内部迭代:

  • 外部:用户控制迭代(调用++next()),
  • 内部:迭代器控制用户代码(请参阅std::foreachIterator::foreach).