Давно известный прием, но вдруг кто-то не знает: если вам не важен порядок элементов в массиве, то удалить объект из середины массива элементарно — извлекаете последний элемент массива и вставляете его на место удаляемого.
Вот простой код для демонстрации:
#include <vector>
#include <stdio.h>
template <class T>
void remove_item( std::vector<T> &v, int i )
{
// Сохраняем последний элемент
const T item = v.back();
// Удаляем последний элемент из массива
v.pop_back();
// Вставляем сохраненный элемента вместо элемента с индексом i
v[i] = item;
}
int main()
{
std::vector<int> v;
v.push_back(10);
v.push_back(11);
v.push_back(12);
v.push_back(13);
v.push_back(14);
printf("before:\n");
for (int i = 0, count = v.size(); i < count; ++i)
{
printf("v[%d] = %d\n", i, v[i]);
}
remove_item(v, 1);
printf("after:\n");
for (int i = 0, count = v.size(); i < count; ++i)
{
printf("v[%d] = %d\n", i, v[i]);
}
}
Вывод:
before:
v[0] = 10
v[1] = 11
v[2] = 12
v[3] = 13
v[4] = 14
after:
v[0] = 10
v[1] = 14
v[2] = 12
v[3] = 13
Обратите внимание, что в remove_item()
происходит копирование последнего элемента. Так что если у вас что-то сложнее простых int
, long
, char
или float
, то этот код вам надо переписать.
Код для ArrayList
(Java). Не проверял, но идея понятна:
public class ArrayListUtil {
public static <T> void removeItem(ArrayList<T> v, int index) {
T item = v.get(v.size() - 1);
v.remove(v.size() - 1);
v.set(index, item);
}
private ArrayListUtil {
}
}
Советую вам использовать стандартные функции std::remove()
и std::remove_if()
, которые делают практически тоже самое и std::vector::erase()
, подробнее можно ознакомиться по ссылке.
vec.erase(vec.begin() + Номер_элемента); //На стандартах ниже 11 никогда не писал, так что хз будет ли там оно работать
В стандартном std::vector::erase() происходит перемещение всех элементов справа от удаляемого на один элемент влево. Этот способ физически не может быть быстрее предложенного мной.
Зачем лишнее (возможно, глубокое) копирование?
v[i] = std::move(v.back());
v.pop_back();
можно не удалять а просто поменять местами и уменьшить размер масива) просто отсекаем последний обєкт
auto it=v.end();
std::swap(v[i],*(it-1));
v.resize(v.size -1); //или v.pop_back();