Получить количество элементов, хранящихся внутри n-мерного вектора - PullRequest
0 голосов
/ 27 августа 2018

У меня есть двумерный вектор:

let vec2d = vec![
    vec![1, 1, 1],
    vec![1, 1, 1],
];

Я могу получить общее количество элементов, хранящихся таким образом:

let mut n_vec_element: i32 = 0;

for i in vec2d.iter() {
    n_vec_element += i.len() as i32;
}

println!("2D vector elements :{}", n_vec_element); // prints 6

Когда я увеличиваю размеры, цикл становится длиннее:

let mut n_vec_element: i32 = 0;

let vec3d = vec![
    vec![
        vec![1, 3, 5 as i32],
        vec![2, 4, 6 as i32],
        vec![3, 5, 7 as i32],
    ],
    vec![
        vec![1, 3, 5 as i32],
        vec![2, 4, 6 as i32],
        vec![3, 5, 7 as i32],
    ]
];

for i in vec3d.iter() {

    // I must add another iter everytime I increment the dimension by 1.
    // Else, it returns the number of stored vector instead of the vector 
    // elements.

    for j in i.iter() { 
        n_vec_size += j.len() as i32;
    }
};

println!("3D vector elements :{}", n_vec_element); // prints 18

Должен быть более краткий способ сделать это, но я еще не понял этого. Первоначально я пытался использовать функцию len() вектора, но, как я уже сказал выше, она возвращает количество векторов, хранящихся вместо своих элементов.

1 Ответ

0 голосов
/ 27 августа 2018

Вам не нужен явный цикл для этого:

let vec2d = vec![
    vec![1, 1, 1],
    vec![1, 1, 1],
];

let n_vec_element: usize = vec2d.iter().map(Vec::len).sum();

assert_eq!(n_vec_element, 6);

Для трехмерного вектора вы можете сделать то же самое:

let vec3d = vec![
    vec![
        vec![1, 3, 5 as i32],
        vec![2, 4, 6 as i32],
        vec![3, 5, 7 as i32],
    ],
    vec![
        vec![1, 3, 5 as i32],
        vec![2, 4, 6 as i32],
        vec![3, 5, 7 as i32],
    ]
];

let n_vec_element: usize = vec3d.iter().flatten().map(Vec::len).sum();

assert_eq!(n_vec_element, 18);

С вектором 4D вы можете поставить 2 flatten и т. Д.


С помощью функции специализации (, т.е. , с ночным компилятором) вы можете обобщить это с помощью уникального метода:

#![feature(specialization)]

trait Count {
    fn count(self) -> usize;
}

impl<T> Count for T {
    default fn count(self) -> usize {
        1
    }
}

impl<T> Count for T
where
    T: IntoIterator,
    T::Item: Count,
{
    fn count(self) -> usize {
        self.into_iter().map(|x| x.count()).sum()
    }
}

fn main() {
    let v = vec![1, 2, 3];
    assert_eq!(v.count(), 3);

    let v = vec![vec![1, 2, 3], vec![4, 5, 6]];
    assert_eq!(v.count(), 6);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...