Можно ли как-то перенести std::move(vec.begin(), vec.end() - 1, vec.begin() +

1) в Rust?

let mut some_vec = vec![String::from("aaa"), String::from("bbb"), String::from("ccc"), String::from("")];

После перемещения some_vec должен выглядеть так: { "aaa", "aaa", "bbb", "ccc" }

34 ответов

25 просмотров
ㅤ-Атеист Автор вопроса

Первый элемент после изменения может быть любым* (необязательно aaa)

А куда пустая строка делать?...

ㅤ-Атеист Автор вопроса
вафля'
А куда пустая строка делать?...

Пустая строка не играет роли, её можно убрать

Пока выглядит как let first = vec[0].clone(); vec.insert(1, first); Но только учти, что это O(n)

ㅤ-Атеист Автор вопроса
вафля'
а её важно убрать?

Вообще всё равно на эту строку. Мне лишь важно сделать std::move(vec.begin(), vec.end() - 1, vec.begin() + 1) (который работает ведь за O(1)?) То есть хотелось бы "сдвигать" часть вектора за константу. Было: {a, b, c, d}, стало {a, a, b, c} (и даже не важно каким будет vec[0] после трансформации)

ㅤ Атеист
Вообще всё равно на эту строку. Мне лишь важно сде...

сдвигать часть вектора за константу не возможно, тебе надо все элементы скопировать

template<class InputIt, class OutputIt> OutputIt move(InputIt first, InputIt last, OutputIt d_first) { while (first != last) { *d_first++ = std::move(*first++); } return d_first; }

ㅤ-Атеист Автор вопроса
Well Done
template<class InputIt, class OutputIt> OutputIt m...

Спасибо! Немного был озадачен тем, что есть ещё и [std::move](https://en.cppreference.com/w/cpp/utility/move) из <utility>

ㅤ-Атеист Автор вопроса

Я тут ещё и UB создал 🙃 > (контекст: OutputIt move( InputIt first, InputIt last, OutputIt d_first ); The behavior is undefined if d_first is within the range [first, last)

ㅤ-Атеист Автор вопроса
вафля'
Пока выглядит как let first = vec[0].clone(); ve...

Понял, что у Vec есть swap (и даже rotate_*!) Так что можно сделать так (если честно, немного грустно, что Vec::swap сделан через вызов unsafe метода, который вызывает ptr::swap, который в свою очередь вызывает copy и copy_nonoverlapping, которые в свою очередь являются интринсиками)

ㅤ Атеист
Понял, что у Vec есть swap (и даже rotate_*!) Так...

Но зачем? Почему не сделать просто if let Some(last) = vec.pop() { vec.insert(0, last); } это будет тоже самое, если не лучше по ""производительности"" и уж точно легче читается

ㅤ Атеист
Понял, что у Vec есть swap (и даже rotate_*!) Так...

да и вообще, реально, почему просто не сделать rotate_right(1)? Ещё легче читается, не вижу вообще проблем...

ㅤ-Атеист Автор вопроса

Честно, не знаю как. Вообще думал, что такие операции получится сделать без unsafe, но по итогу внутри есть unsafe. Хотя это и справедливо, ведь манипулировать сырыми указателями — это опасно, здесь надо быть внимательным.

ㅤ Атеист
Честно, не знаю как. Вообще думал, что такие опера...

Ну стдлиб раста даёт слой над ансейфовым миром, а не магическим образом делает всё сейфовым)

ㅤ Атеист
Честно, не знаю как. Вообще думал, что такие опера...

Safe подмножество строится исключительно на ансейфе с проверенными обёртками

ㅤ-Атеист Автор вопроса
Traveller Kolsky
rotate_right - к деку, а не вектору тогда уж

Не понял вас. дек — VecDeque? У него есть rotate_right У Vec тоже есть rotate_right

rotate_right у VecDeque — O(n), где n — параметр (rotate_right(n)) rotate_right у Vec — O(n), где n — размер вектора (vec.len())

ㅤ-Атеист Автор вопроса
вафля'
rotate_right у VecDeque — O(n), где n — параметр (...

а, ну вот в документации написано: Vec — Takes linear (in self.len()) time. VecDeque — Takes O(min(k, len() - k)) time and no extra space.

вафля'
Но зачем? Почему не сделать просто if let Some(la...

Отличный вариант, имхо, что еще вам нужно?

ㅤ Атеист
Не понял вас. дек — VecDeque? У него есть rotate...

Что ты по итогу сделал, если не секрет?

ㅤ-Атеист Автор вопроса
Well Done
Что ты по итогу сделал, если не секрет?

Vec. Вообще при маленьких значениях без разницы ведь, что брать, но с Vec я уже знаком!

ㅤ Атеист
Vec. Вообще при маленьких значениях без разницы ве...

Я про повороты, сдвиги, шаманство с материнской платой. Что решил использовать?

ㅤ-Атеист Автор вопроса
Well Done
Я про повороты, сдвиги, шаманство с материнской пл...

rotate_right. Можно, конечно, изобрести велосипед, но зачем?

ㅤ-Атеист Автор вопроса

вообще я решал задачу на LeetCode (Burst Balloons). Там дан Vec<i32> и чтобы не мучиться с границами, я решил "по бокам" добавить единицы. было: [a, b, c, d], стало: [1, a, b, c, d, 1] ну и можно было бы сделать это двумя разными способами: 1)vec.push(1); vec.insert(0); 2) vec.resize(vec.len() + 2, 1); vec.rotate_right(1); первый способ проще понять и проще написать

ㅤ Атеист
вообще я решал задачу на LeetCode (Burst Balloons)...

есть ещё третий путь (я бы так в первую очередь попыталась сделать): use std::iter::once; let vec = once(1).chain(vec.into_iter()).chain(once(1));

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
Карта сайта