Рассмотрим структуру данных, содержащую буфер фиксированного размера, который владеет на месте членами некоторого произвольного нетривиального типа.Буфер неупорядочен, но его содержимое хранится непрерывно, используя фиксированный массив и значение счетчика.Каков современный идиоматический способ C ++ уничтожить элемент в этом массиве и заменить его слот последним элементом массива, чтобы сохранить непрерывность?Я особенно обеспокоен тем, чтобы убедиться, что элемент должным образом разрушен, а замена правильно и эффективно перемещена.К сожалению, std::vector
здесь не вариант.
Вот что я могу придумать от руки:
void destroy_replace(
std::array<arbitrary, 20>& arr,
size_t& count,
size_t index)
{
SOME_ASSERT_MACRO(index < count);
std::destroy_at(std::addressof(arr.at(index)));
arr[index] = std::move(arr.at(count - 1));
--count;
}
Это правильно?Особенно std::destroy_at
?
Нужен ли ход?Могу ли я сделать это как конструктор перемещения с новым размещением?
Правильный ли порядок операций в отношении гарантий исключений?