«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему `std::remove` переупорядочивает элементы вместо их удаления в C++?

Почему `std::remove` переупорядочивает элементы вместо их удаления в C++?

Опубликовано 19 ноября 2024 г.
Просматривать:549

  Why Does `std::remove` Rearrange Elements Instead of Deleting Them in C  ?

Понимание разницы: стереть и удалить

В сфере программирования на C std::erase и std::remove — это два отдельные функции, которые служат разным целям, когда дело доходит до изменения контейнеров. Хотя обе функции можно использовать для удаления элементов из контейнера, они различаются по своему поведению.

Std::remove: Перестановка элементов и удаление

Std:: Remove — это алгоритм, который работает с диапазоном элементов и переупорядочивает их внутри контейнера. Он не удаляет элементы напрямую, а перемещает несовпадающие элементы поверх совпадающих. Этот процесс создает кластер совпадающих элементов в начале последовательности и несовпадающих элементов в конце.

Std::erase: Удаление элементов

На с другой стороны, std::erase — это функция, которая удаляет указанные элементы из контейнера, эффективно уменьшая его размер. Он принимает диапазон итераторов в качестве аргументов и удаляет все элементы в этом диапазоне, включая элементы, помеченные для удаления.

Понимание вывода

В приведенном примере кода: можно сделать следующие наблюдения:

  1. Std::remove: Когда std::remove используется без std::erase, он просто переставляет элементы, оставляя размер вектора неизменным. Таким образом, итерация по вектору приведет к выводу 2,2.
  2. Std::erase: Когда std::erase используется в сочетании с std::remove, он удаляет соответствующие элементы (в данном случае единственное вхождение 1) и соответствующим образом обновляет размер вектора. В результате в выводе отображается только 2.

Дополнительные примечания к Std::remove

  1. Использование за пределами Erase-Remove Идиома: В то время как std::remove обычно используется с стиранием как часть команды «erase-remove идиома», его также можно использовать независимо. Это полезно в сценариях, где порядок удаления не имеет решающего значения, а основной целью является разделение совпадающих и несовпадающих элементов внутри контейнера.
  2. Обоснование отказа от удаления: Конструкция std::remove, не требующий удаления, обусловлен его способностью работать с произвольными прямыми итераторами. Такие итераторы могут не иметь возможности удалять элементы, отсюда и ограниченная функциональность std::remove.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3