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...
这是有道理的;在上面的代码中有两个迭代器(begin
和 end
迭代器),它使用 for
循环并递增。
在 Rust 中,迭代器是这样使用的:
let vect = vec![1, 2, 3, 4];
let vect_iter = vect.iter();
什么?要对其进行迭代,您可以:
vect_iter.next();
vect_iter.next();
我在 Rust 文档中找不到指针的任何确切定义,但查看 Iterator
trait ,似乎迭代器是容器的包装器,通过以某种方式标准化逻辑(如果这有意义的话),可以更轻松地处理。
我的主要问题是:
- 主要区别是什么?
- 为什么 Rust 有这种方式的迭代器,为什么它们的表达方式如此不同?
- C++ 中有 Rust 类型的迭代器吗?
- Rust 中有 C++ 类型的迭代器吗?
- 它们被称为特定的东西吗? (内部/外部?)
最佳答案
迭代器是编程语言中的一个概念,指的是允许迭代元素集合或序列的构造。这个概念是故意模糊的,它是一个概念!它没有规定任何具体的实现。
为了更容易区分 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。这排除了一对游标:
- 一对游标是不安全的:你可以很容易地迭代越界,并且你可以获得别名引用,
- 一对游标容易出错:很容易意外地将两个不同序列的游标配对。
为了控制bounds、aliasing和避免pair mismatch,你必须使用单个对象;因此类似于流的 API。
Iterator
Rust 中的 API 让人想起 Java 和 C#,尽管 Rust 通过使用 Option<T>
对其进行了改进。这样就可以代替笨拙的hasNext()
/next()
调用对,它提供了一个方法 next()
它既可以推进流,也可以发出结束的信号。
结论
Rust 和 C++ 都具有迭代元素集合的方法:
- C++ 提供了一种类似 C 的方式,灵活但容易出错,
- Rust 提供了一种现代方式,安全但不太灵活。
两种语言还提供external和internal迭代:
- 外部:用户控制迭代(调用
++
或next()
), - 内部:迭代器控制用户代码(参见
std::foreach
和Iterator::foreach
)。
关于c++ - Rust 迭代器和 C++ 迭代器之间的主要区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48999776/