Почему нет "удаления по индексу" для векторов с ++?
Я знаю, что мне нужно написать:
myvector.erase (myvector.begin()+5)
удалить пятую позицию в myvector
,
У меня вопрос почему?
В Python я могу написать: del myvector[5]
,
3 ответа
Чтобы обеспечить единый интерфейс для всех контейнеров STL, которые будут работать с общими алгоритмами.
C++ и Python имеют разную философию дизайна. В случае C++ все контейнеры STL и универсальные алгоритмы связаны через шаблон итератора, и каждый интерфейс контейнера является настолько универсальным, насколько это возможно.
Общий интерфейс удаления элемента из контейнера STL должен быть итератором, так как индекс специфичен для структур данных на основе индекса, например, вектора. Но ассоциативные контейнеры, например, map, не основаны на индексах и в результате не могут получить индекс для удаления.
Вы не можете взять индекс для удаления из контейнеров на основе индекса и взять ключ для удаления из ассоциативных контейнеров, так как в этом проекте не будет возможности написать универсальный алгоритм, который может удалять из обоих типов контейнеров.
У меня вопрос почему?
Поскольку стандартная библиотека не предоставляет функцию-член для std::vector
это занимает индекс i
удалить i
элемент Версия итератора является более общей и единой с остальной частью интерфейса.
В качестве примера, std::find_if
вернуть итератор. Вы часто хотите стереть результат, возвращенный std::find_if
, Было бы неудобно каждый раз конвертировать итератор в индекс.
Тривиально реализовать то, что вы хотите:
template <typename Container>
void erase_nth(Container& c, std::size_t i)
{
c.erase(std::begin(c) + i);
}
Использование:
std::vector<int> v{0, 1, 2, 3, 4};
erase_nth(v, 2);
assert(v == std::vector<int>{0, 1, 3, 4});
У меня вопрос почему?
Потому что именно так интерфейс std::vector
был разработан.
container.erase(iterator)
это идиома, которая поддерживается всеми стандартными контейнерами C++ (которые вообще поддерживают erasure) и поддерживает гораздо более разнообразную логику, чем просто "erase element at index".
Я не могу говорить за стандартный комитет, но я могу рассуждать, что, поскольку это более общее стирание итератора может быть тривиально использовано для удаления элемента в индексе, нет необходимости также предоставлять отдельную функцию специально для этого. Если вы хотели бы иметь такую вещь, легко написать функцию, которая делает vector_arg.erase(vector_arg.begin() + index_arg)
,