Чтобы сделать этот код универсальным, чтобы он работал независимо от того, поддерживает ли итератор operator +
, и использует наиболее эффективную доступную реализацию:
template <typename C>
void erase_at(C& container, typename C::size_type index) {
typename C::iterator i = container.begin();
std::advance(i, index);
container.erase(i);
}
Внутренне, std::advance
использует operator +
, еслиТип итератора это поддерживает.В противном случае (например, для std::list<>::iterator
) он перемещает итератор на один шаг за раз в цикле, точно так же, как и первый код, который вы опубликовали.