Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Удаление элемента вектора за О(1), если не требуется сохранять порядок элементов #593

Open
perfectGenius opened this issue May 8, 2024 · 11 comments

Comments

@perfectGenius
Copy link

Копируем последний элемент вектора на место удаляемого и сдвигаем указатель конца на один элемент.
Можно назвать что-то типа erase_unordered.

@tomilov
Copy link

tomilov commented May 8, 2024

Зачем делать все комбинаторно возможные методы, которые реализуются из различных пар уже существующих методов std::vector? Какая цель? Чтобы что?

@perfectGenius
Copy link
Author

Поменьше и попроще кода, больше производительность.

@tomilov
Copy link

tomilov commented May 8, 2024

Производительность не больше. Ни на такт.

@perfectGenius
Copy link
Author

Зачем делать все комбинаторно возможные методы

Почему же тогда вместо pop_back просто не делать resize -1?

@tomilov
Copy link

tomilov commented May 9, 2024

делать

@GitSparTV
Copy link

Чтобы понимать, имеется в виду:

std::swap(*it, vec.back());
vec.pop_back();

@vtopunov
Copy link

Чтобы понимать, имеется в виду:

std::swap(*it, vec.back());
vec.pop_back();

*it = std::move(vec.back()); vec.pop_back();

@perfectGenius
Copy link
Author

perfectGenius commented May 10, 2024

std::swap(*it, vec.back());
vec.pop_back();

А как же производительность? Т.е. зачем выделять буфер для обмена и копировать удаляемый элемент? Надежда на компилятор, что он поймёт замысел и не станет делать лишнее?
Скорее уж что-то типа

вектор[it] = вектор.back());
вектор.pop_back();

Производительность не больше. Ни на такт.

Может оказаться, что компилятор в некоторых случаях не поймёт, что эти две строки можно выполнять параллельно после получения адреса последнего элемента. А если это одна функция, то это будет однозначно.
Также может немного повыситься скорость компиляции, т.к. не надо парсить и разбирать лишнее, изучать связи.

@GitSparTV
Copy link

Почему не *it = std::move(vec.back());?

@perfectGenius
Copy link
Author

move разве автоматически делает pop_back?
Если вы про мой пример, то можно и так, у меня пока мало опыта с итераторами.

@GitSparTV
Copy link

Не заменит, я только про первую строчку. Копирование не понравилось.

*it = std::move(vec.back());
vec.pop_back();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants