Какова лучшая практика при работе с двойными векторами строк - PullRequest
0 голосов
/ 04 мая 2019

Мне нужно хранить 2D сетку строк произвольного размера.Я изо всех сил манипулирую векторами Rust.Вот что я сделал:

let mut grid : Vec<&mut Vec<String>> = Vec::new();
let mut v0 : Vec<String> = Vec::new();
let mut v1 : Vec<String> = Vec::new();

v0.push("first string into v0".to_string());
v1.push("first string into v1".to_string());

grid.push(&mut v0); // in position 0
grid.push(&mut v1);

println!("{:?}", &grid);

И он возвращает (как и ожидалось),

[["первая строка в v0"], ["первая строка в v1"]]

Позже я хочу добавить строку в v0

    let t1 = grid.get_mut(0);
    let t2 = t1.unwrap();
    t2.push("A new string into v0".to_string());

    println!("{:?}", &grid);

Затем получится:

[["первая строка в v0", "Новая строка в v0""], [" первая строка в v1 "]]

Итак, это сработало, но является ли это оптимальным решением при использовании вектора векторов?

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Вы делаете все почти правильно.Первый вопрос, который приходит на ум - почему вы используете Vec<&mut Vec<String>>.В этом случае vecs v0 и v1 должны пережить сетку, что не обязательно является хорошей идеей.Я бы предложил Vec<Vec<String>>.

Джоэл Беркли предлагает в своем ответе, что вы можете сгладить Вектор, но он не объясняет, почему вы хотите сделать это в сетке.Причина в том, что ржавые 2D Векторы всегда будут указывать на другие векторы, заставляя ЦП брать две косвенные ссылки, чтобы получить реальные данные, что плохо для локальности кэша, что зависит от того, что вы делаете, вы можете заботиться или не заботиться.Если вы пишете действительно высокопроизводительный код, вы захотите это сделать, но в зависимости от того, какое приложение вы разрабатываете, вам не следует предварительно оптимизировать код заранее: https://softwareengineering.stackexchange.com/questions/80084/is-premature-optimization-really-the-root-of-all-evil

Я бы также предложил использовать макрос vec! для определения ваших векторов, если это возможно: https://doc.rust -lang.org / std / macro.vec.html

0 голосов
/ 04 мая 2019

Это зависит от того, что вы планируете делать с ним (т.е. что означает «оптимальный» здесь), но если вы знаете ожидаемый размер вашей сетки, вы можете сгладить свой Vec. Вместо n-длины Vec, содержащей m-длину &mut Vec<String> s, вы можете использовать одну (n x m) -длину Vec<&mut String>, а затем определить, где будут эквивалентные индексы, например, вместо grid[2][5] вы бы grid[2*m + 5].

Вам понадобится либо страж, чтобы обозначить неназначенного: возможно, "", либо вы можете Vec<&mut Option<String>> и использовать None.

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