cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open perfectGenius opened 1 month ago

perfectGenius commented 1 month ago

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

tomilov commented 1 month ago

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

perfectGenius commented 1 month ago

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

tomilov commented 1 month ago

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

perfectGenius commented 1 month ago

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

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

tomilov commented 1 month ago

делать

GitSparTV commented 1 month ago

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

std::swap(*it, vec.back());
vec.pop_back();
vtopunov commented 1 month ago

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

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

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

perfectGenius commented 1 month ago
std::swap(*it, vec.back());
vec.pop_back();

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

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

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

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

GitSparTV commented 1 month ago

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

perfectGenius commented 1 month ago

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

GitSparTV commented 1 month ago

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

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