kohi11 Ответов: 1

Как правильно удалить определенные элементы блока с указателями?


auto end=pointer;
while(beginning!=end){
    duplicate=0;
    next=beginning+1;
    while(next!=end){
        if(function(*next)==function(*beginning)){
           duplicate++; 
        }
        next++;
    }
    if(duplicate>0)
    end=std::remove(beginning,end,function(*next));

    beginning++;
}


Что я уже пробовал:

Этот фрагмент кода является частью функции, которая выглядит примерно так:
авто DeleteEvery(TipElemenata начала,TipElemenata &амп;указатель)-&ГТ;имя_типа с std::remove_reference&ЛТ;decltype(*начало)&ГТ;::тип*

начало-это указатель на первый элемент блока(вектор, массив или что-то в этом роде)
end - это указатель, который указывает сразу после последнего элемента блока
Итак, я должен удалить все элементы, для которых функция возвращает одно и то же значение. Теперь я знаю, что функция "удалить" из алгоритма библиотеки на самом деле не удаляет элементы, а перемещает их. Вот почему я использую указатель, который возвращает "удалить", чтобы указать новый конец блока. Но кажется, что он пропускает некоторые элементы. Что я делаю не так?

0x01AA

Почему, черт возьми, вы ожидаете "следующего" после того, как внутреннее время все еще действует?

kohi11

Да, извините, я должен был написать функцию remove для удаления *end во внутреннем цикле while и добавить функцию remove для удаления *beginning после условия if(duplicate>0). Но он все равно пропускает элементы.

1 Ответов

Рейтинг:
0

Shao Voon Wong

Вы всегда можете воспользоваться стереть-удалить идиому[^] чтобы удалить элементы из вектора, если это не школьная работа по программированию.

Стереть-удалить идиома пересмотреть[^]