Мне удалось сделать это за один доступ, одну запись и одно удаление ключа в худшем случае. Последнее удаление ключа не обязательно, но я не уверен, что это возможно. Я старался изо всех сил. Надеюсь, это поможет!
Хорошо, я думаю, что мы хотим использовать Entry API .
Полный список методов для Entry
- здесь .
Думаю, мы бы сделали это в следующем порядке:
- Если
m
содержит значение w
с индексом k
: (еще два шага ) - Или вставьте
v
в индекс k
.
Это можно сделать, используя .and_modify
, а затем .or_insert
. Что-то вроде этого:
let map = // ... Initialize the map
// Do stuff to it
// ...
// Our important bit:
let mut delete_entry = false;
map.entry(k)
.and_modify(|w| { // If the entry exists, we modify it
let u = combine(v, w);
match u {
Some(y) => *w = y;
None => delete_entry = true;
}
}
)
.or_insert(v); // If it doesn't, we insert v
if delete_entry {
map.remove(k);
}
Я не думаю, что есть способ сделать все три вещи без этого последнего map.remove
доступа, так что это моя лучшая попытка на данный момент.