Size: a a a

Rust — русскоговорящее сообществo

2020 September 21

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Zymlex (Юрий)
можно, конечно и for, но он как-то больше для массивов
По-моему с
for _ in 0..2 {} будет чище
источник

Э

Эрик in Rust — русскоговорящее сообществo
Zymlex (Юрий)
let mut i = 0;
while i < 2 {
   if let Some(index) = vec.iter().position(|&x| x == 0 || x == 4) {
       vec.remove(index);
   }
   i += 1;
}
Возможно ли сократить такой код, без использования retain?
(0..2).for_each(|_| if let Some(index) = vec.iter().position(|&x| x == 0 || x == 4) {
       vec.remove(index);
   })
источник

Z

Zymlex (Юрий) in Rust — русскоговорящее сообществo
Эрик
(0..2).for_each(|_| if let Some(index) = vec.iter().position(|&x| x == 0 || x == 4) {
       vec.remove(index);
   })
Спасибо, хоть и тут не без слайса
источник

Э

Эрик in Rust — русскоговорящее сообществo
Лично мне vec.iter() вместо vec[last_found_pos..].iter() не нравится и то, что если в первую итерацию ничего не нашлось, вторая всё равно будет.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Ну и есть вопрос, нужен именно Vec::remove или Vec::swap_remove сойдёт?
источник

Z

Zymlex (Юрий) in Rust — русскоговорящее сообществo
Эрик
Лично мне vec.iter() вместо vec[last_found_pos..].iter() не нравится и то, что если в первую итерацию ничего не нашлось, вторая всё равно будет.
Спс, посмотрю. Значения обычно находятся на 0-1 индексах, поэтому и нет желания делать итерацию по всему вектору.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Вообще, если у тебя всего две итерации максимум, то можно и без лупа обойтись, просто руками развернуть.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Zymlex (Юрий)
Спс, посмотрю. Значения обычно находятся на 0-1 индексах, поэтому и нет желания делать итерацию по всему вектору.
Заметь, что remove делает обход всего вектора в таком случае.
источник

Э

Эрик in Rust — русскоговорящее сообществo
if let Some(index) = vec.iter().position(|&x| x == 0 || x == 4) {
vec.remove(index);
if let Some(index) = vec[index..].iter().position(|&x| x == 0 || x == 4) {
 vec.remove(index);
}
}
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Если надо часто удалять из начала, то VecDeque лучше
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Эрик
if let Some(index) = vec.iter().position(|&x| x == 0 || x == 4) {
vec.remove(index);
if let Some(index) = vec[index..].iter().position(|&x| x == 0 || x == 4) {
 vec.remove(index);
}
}
Имхо выглядит копипастно
источник

Э

Эрик in Rust — русскоговорящее сообществo
Mikail Bagishov
Имхо выглядит копипастно
Как что-то плохое.
источник

Z

Zymlex (Юрий) in Rust — русскоговорящее сообществo
Mikail Bagishov
Заметь, что remove делает обход всего вектора в таком случае.
А зачем так, если индекс указан и длина известна?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Zymlex (Юрий)
А зачем так, если индекс указан и длина известна?
Потому что все последующие элементы надо сдвинуть влево.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Zymlex (Юрий)
А зачем так, если индекс указан и длина известна?
Vec::swap_remove, читай описание.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Вектор всегда хранит содержимое в непрерывном куске памяти.
источник

Z

Zymlex (Юрий) in Rust — русскоговорящее сообществo
Mikail Bagishov
Вектор всегда хранит содержимое в непрерывном куске памяти.
и сдвинуть указатель на начало нельзя?
источник

Z

Zymlex (Юрий) in Rust — русскоговорящее сообществo
т.е. почему сдвигание элементов, а не начала?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Zymlex (Юрий)
и сдвинуть указатель на начало нельзя?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Zymlex (Юрий)
и сдвинуть указатель на начало нельзя?
Нет, потому что аллокатор вернул именно тот адрес. Частично освободить область памяти нельзя.
источник