У вас есть решение, и оно кажется совершенно нормальным.Идиоматический способ написать его на C ++ - это не создать другой класс (и , пожалуйста , не наследовать от std::vector
), а просто написать функцию:
template <typename T>
void remove_at(std::vector<T>& v, typename std::vector<T>::size_type n)
{
std::swap(v[n], v.back());
v.pop_back();
}
Использование:
remove_at(v, 42);
Это дает ту же гарантию исключения, что и std::swap<T>
.
Теперь, если вы хотите вернуть объект, и у вас есть доступ к C ++11 компилятор, вы можете сделать это следующим образом.Сложной задачей является обеспечение базовой гарантии исключения во всех случаях:
template <typename T>
T remove_at(std::vector<T>&v, typename std::vector<T>::size_type n)
{
T ans = std::move_if_noexcept(v[n]);
v[n] = std::move_if_noexcept(v.back());
v.pop_back();
return ans;
}
Действительно, вы не хотите, чтобы вектор оставался в недопустимом состоянии, если во время операции перемещения выдается исключение.