Rust: сопоставьте два Vecs с третьим Ve c составных структур - PullRequest
2 голосов
/ 16 февраля 2020

У меня есть три структуры:

struct A;

struct B;

struct C {
    a: Option<A>,
    b: Option<B>
}

Учитывая данные Vec<A> и Vec<B> и некоторую функцию предиката, я хочу создать вывод Vec<C>, который является комбинацией элементов входные данные, что-то вроде следующего:

let aVec: Vec<A> = vec![];
let bVec: Vec<B> = vec![];
let mut cVec: Vec<C> = vec![];
for a in aVec {
    if let Some(b) = bVec.into_iter().find(predicate) {
        cVec.push(C{a: Some(a), b: Some(b)});
    }
}

Есть ли способ сделать это без необходимости B для копирования? Оба входных вектора не требуются после операции. Кроме того, возможно ли это без l oop?

1 Ответ

2 голосов
/ 16 февраля 2020

Вы можете:

  • Найти индекс элемента, удовлетворяющего predicate. (Я бы использовал Iterator::position.)
  • remove или swap_remove элемент в позиции, полученной на предыдущем шаге.
  • push ранее удаленный элемент в результате.

В коде:

use itertools; // 0.8.2
use itertools::Itertools;

struct A {}

struct B {
    n: usize,
}

struct C {
    a: Option<A>,
    b: Option<B>
}

fn  main() {
    let aVec: Vec<A> = vec![];
    let mut bVec: Vec<B> = vec![];
    let mut cVec: Vec<C> = vec![];
    for a in aVec {
        if let Some(idx) = bVec.iter()
                               .position(|b| b.n==42)
        {
            let b = bVec.remove(idx); // or swap_remove if ordering does not need to be preserved
            cVec.push(C{a: Some(a), b: Some(b)});
        }

    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...