4 ms·
> C++ lets you have as many iterators as you like into the same container While it's true that Rust doesn't let you have multiple mutable iterators, it's worth
by Twisol 8y ago
> C++ lets you have as many iterators as you like into the same container
While it's true that Rust doesn't let you have multiple mutable iterators, it's worth pointing out that you can certainly have multiple immutable iterators.
let items = &[42, 101];
// All products (a*a, a*b, b*a, b*b)
for x in items {
for y in items {
println!("{}", x * y);
}
}
println!("");
// Pairwise products (a*a, b*b)
let pairs = Iterator::zip(items.iter(), items.iter());
let pointwise_products = pairs.map(|(x, y)| x * y);
for product in pointwise_products {
println!("{}", product);
}
- klodolph 8y agoThat's really not what I'm talking about. In your example you are using multiple iterators to iterate over the same structure multiple times, but in C++ you can use pairs of iterators to represent ranges. For example, I can have three iterators i, j, and k, which represent two ranges: i..j and j..k. Even if i, j, k are const iterators, it's not pleasant to translate this to Rust. So it's not an issue of whether Rust lets you have multiple iterators or not, the issue is that Rust iterators are strictly less expressive than C++ iterators. And that's okay. It's a tradeoff. For more information about how iterators are used in C++, I would refer to the <algorithms> portion of the standard library. https://en.cppreference.com/w/cpp/algorithm https://en.cppreference.com/w/cpp/algorithm
- arcticbull 8y agoIs that different from something like this? fn main() { let list = &[0, 1, 2, 3, 4, 5, 6, 7, 8]; let i = 0; let j = 4; let k = 8; let iter_ij = list[i ..= j].iter(); let iter_jk = list[j ..= k].iter(); let pairs = Iterator::zip(iter_ij, iter_jk); for (a, b) in pairs { println!("{}, {}", a, b); } }
- klodolph 8y agoYes, that is different, because in C++ you can move j forward and backwards.
- arcticbull 8y agoAhh, I see, thanks for clarifying. Rust's Iterators are similar to C++ ForwardIterators. It seems C++'s default is BidirectionalIterator.
- klodolph 8y agoEven C++ ForwardIterators are more powerful, because you can move them independently. Rust lets you move the beginning of the range forwards, and maybe the end of the range backwards. With ForwardIterator you would be able to move the end of the range forwards, making the range longer.
- Twisol 8y agoAh, I understand. You're referring to how iterators in C++ are generalized indices into their collections. Certainly, Rust iterators have a more constrained purpose. I personally prefer having separate constructs for iteration and indexing, so I think it's a matter of taste.