Существуют два способа, с помощью которых вы можете особенно стереть объект.
давайте возьмем вектор
std :: vector < int > v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(40);
v.push_back(50);
1) Неэффективный способ: Хотя это кажется довольно эффективным, но это не потому, что функция стирания удаляет элементы и сдвигает все элементы влево на 1.
так что его сложность будет O (n ^ 2)
std :: vector < int > :: iterator itr = v.begin();
int value = 40;
while ( itr != v.end() )
{
if(*itr == value)
{
v.erase(itr);
}
else
++itr;
}
2) Эффективный способ (РЕКОМЕНДУЕТСЯ) : Он также известен как УДАЛЕНИЕ - УДАЛИТЬ идиомы .
- std :: remove преобразует данный диапазон в диапазон со всеми элементами, которые сравниваются не равными данному элементу, смещенными в начало контейнера.
- Так что на самом деле не удаляйте совмещенные элементы.
Он просто сдвинул несоответствие к началу и дает итератору новый действительный конец.
Это просто требует сложности O (n).
Вывод алгоритма удаления:
10 20 30 50 40 50
в качестве возвращаемого типа удаления используется итератор для нового конца этого диапазона.
template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
Теперь используйте функцию стирания вектора, чтобы удалить элементы из нового конца в старый конец вектора. Требуется время O (1).
v.erase ( std :: remove (v.begin() , v.end() , element ) , v.end () );
, поэтому этот метод работает в O (n)