c++ - Rust 迭代器和 C++ 迭代器之间的主要区别是什么?

标签 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

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

An iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators...

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

在 Rust 中,迭代器是这样使用的:

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

let vect_iter = vect.iter();

什么?要对其进行迭代,您可以:

vect_iter.next();
vect_iter.next();

我在 Rust 文档中找不到指针的任何确切定义,但查看 Iterator trait ,似乎迭代器是容器的包装器,通过以某种方式标准化逻辑(如果这有意义的话),可以更轻松地处理。

我的主要问题是:

  1. 主要区别是什么?
  2. 为什么 Rust 有这种方式的迭代器,为什么它们的表达方式如此不同?
  3. C++ 中有 Rust 类型的迭代器吗?
  4. Rust 中有 C++ 类型的迭代器吗?
  5. 它们被称为特定的东西吗? (内部/外部?)

最佳答案

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

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

  • C++ 迭代器将被命名为 cursors
  • Rust 迭代器将被命名为 streams

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


C++

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

An iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators...

简单,错误

光标可以:

  • 指向一个元素,
  • 或者是singular并且根本不指向任何元素。

一般用奇异值来表示:

  • 要迭代的序列的结尾:vec.end() ,
  • 缺少元素:std::find(...) .

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

为什么 C++ 使用这种表示法?因为这就是 C 的做法,而且效果很好……虽然它很容易出错。


使用rust

Rust 致力于确保安全并偏爱易于使用的 API。这排除了一对游标:

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

为了控制boundsaliasing和避免pair mismatch,你必须使用单个对象;因此类似于流的 API。

Iterator Rust 中的 API 让人想起 Java 和 C#,尽管 Rust 通过使用 Option<T> 对其进行了改进。这样就可以代替笨拙的hasNext()/next()调用对,它提供了一个方法 next()它既可以推进流,也可以发出结束的信号。


结论

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

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

两种语言还提供externalinternal迭代:

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

关于c++ - Rust 迭代器和 C++ 迭代器之间的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48999776/

相关文章:

c++ - 在 C++ 文件中使用仅 C header 实现时 undefined symbol

time - 格式化 std::time 输出

generics - 无法创建简洁和通用的错误类型

rust - 包装 C lib 初始化/销毁例程的推荐方法

c++ - 为什么我需要另一个迭代器作为 std::copy() 中的参数?

c++ - 使用不同线程时 Win32 API 死锁

c++ - 静态成员函数

c++ - 虽然循环条件不起作用

java - 迭代器堆栈 hasNext() 不返回 true

c++ - 当迭代器不是随机访问时,如何在映射结束之前停止迭代 "n"?