Size: a a a

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

2020 October 10

KA

Korolll And in Rust — русскоговорящее сообществo
Эрик
fn split_by_pred<T, F>(s: &mut [T], mut predicate: F) -> (&mut [T], &mut [T])
where
F: FnMut(&mut T) -> bool,
{
let mut left = 0;
let mut right = s.len();
while left < right {
 if predicate(&mut s[left]) {
  right -= 1;
  s.swap(left, right);
 } else {
  left += 1;
 }
}

s.split_at_mut(left);
}
мне кажется, что за свапы заплатить придётся?
источник

Э

Эрик in Rust — русскоговорящее сообществo
Korolll And
мне кажется, что за свапы заплатить придётся?
За всё платить надо.
источник

Э

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

Э

Эрик in Rust — русскоговорящее сообществo
Но мне лень. Сам, всё сам делай.
источник

KA

Korolll And in Rust — русскоговорящее сообществo
хорошо, спасибо)
я просто думал мало ли библиотечная функция есть (просто не нашёл)
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
А ему не надо их по предикату сначала распихать налево и направо?
А, извиняюсь.

Странно что в std нет такого, хотя вроде другие partition есть...

Впрочем в itertools есть partition который позволяет такое провернуть:
let mut vec = ...;
let at = itertools::partition(vec.iter_mut(), f);

let (left, right) = vec.split_at(at);
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
А, извиняюсь.

Странно что в std нет такого, хотя вроде другие partition есть...

Впрочем в itertools есть partition который позволяет такое провернуть:
let mut vec = ...;
let at = itertools::partition(vec.iter_mut(), f);

let (left, right) = vec.split_at(at);
Ну, в std есть партишон, который коллектит две коллекции.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А все партишоны на слайсе только в найтли.
источник

Э

Эрик in Rust — русскоговорящее сообществo
partition_in_place на итераторе тоже найтли.
источник

KA

Korolll And in Rust — русскоговорящее сообществo
может как-то так?

let mut (right, left) = (slice.rsplit(pred), slice.split(pred))
источник

Э

Эрик in Rust — русскоговорящее сообществo
У тебя что, уже отсортированно по предикату?
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
partition_in_place на итераторе тоже найтли.
partition_in_place ~= itertools::partition?
источник

KA

Korolll And in Rust — русскоговорящее сообществo
Эрик
У тебя что, уже отсортированно по предикату?
нет
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Эрик
А все партишоны на слайсе только в найтли.
Они там ещё и странные, по предикату почему-то нет...
источник

KA

Korolll And in Rust — русскоговорящее сообществo
вафель 🧇
А, извиняюсь.

Странно что в std нет такого, хотя вроде другие partition есть...

Впрочем в itertools есть partition который позволяет такое провернуть:
let mut vec = ...;
let at = itertools::partition(vec.iter_mut(), f);

let (left, right) = vec.split_at(at);
а partition что-то перекладывает судя по vec.iter_mut()
источник

Э

Эрик in Rust — русскоговорящее сообществo
Korolll And
а partition что-то перекладывает судя по vec.iter_mut()
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Korolll And
а partition что-то перекладывает судя по vec.iter_mut()
Ну да. Ты же хочешь получить 2 слайса
источник

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
О, там into iter, можно просто c &mut vec вызвать
источник

Э

Эрик in Rust — русскоговорящее сообществo
вафель 🧇
О, там into iter, можно просто c &mut vec вызвать
Менее эффективная имплементация, если сравнивать с partition_in_place.
источник