【Rust】イテレータ(iterator)

トレイトを実装するオブジェクトをイテレータと呼ぶ
イテレータとは、連続したオブジェクトを順番に取り扱うための機能を提供するオブジェクト

pub trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
    
    // methods with default implementations elided
}

イテレータにはmap、filter、collectなどのメソッドがある。

fn main(){
    let vec = vec![1, 2, 3, 4, 5];
    let mut iter = vec.iter();

    while let Some(item) = iter.next() {
        println!("{}", item);
    }
}
struct Counter {
    max: u32,
    count: u32,
}

impl Counter {
    fn new(max: u32) -> Counter {
        Counter {max: max, count: 0}
    }
}

impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<Self::Item>{
        self.count += 1;
        if self.count < self.max {
            Some(self.count)
        } else {
            None
        }
    }
}

fn main(){
    let counter = Counter::new(10);
    for c in counter {
        println!("{}", c);
    }
}

C++

#include <bits/stdc++.h>
using namespace std;

int main() {
    vector<int>a = {1, 2, 3, 5};
    auto itr = find(a.begin(), a.end(), 3);

    if (itr == a.end()) {
        cout << "not found" << endl;
    } else {
        int idx = distance(a.begin(), itr);
        cout << "a[" << idx << "] =" << *itr << endl;
    }
}
fn main(){
    let a = vec![1, 2, 4, 6, 8];
    let mut iter = a.iter();

    let mut counter = 0;
    while let Some(item) = iter.next() {
        counter = counter + 1;
        if *item == 3 {
            println!("idx {}", counter);
            break;
        } 
        if counter == a.len() {
            println!("not found");
        }
    }
}

毎回、もうちょっと上手い書き方が絶対にあると思う。。