Что вам нужно сделать, так это использовать std::remove_if
для получения вектора без соответствующего элемента.
Однако после того, как вы выполнили вызов std::remove_if
, у вас не будет возможности delete
совпадающих элементов в качестве документация гласит (выделено мной):
Удаление выполняется путем сдвига (посредством присваивания перемещения) элементов в диапазоне таким образом, чтобы элементы, которые не подлежат удалению, оказались в начале диапазона. Относительный порядок оставшихся элементов сохраняется, а физический размер контейнера не изменяется. Итераторы, указывающие на элемент между новым логическим концом и физическим концом диапазона, по-прежнему могут быть разыменованы, но сами элементы имеют неуказанные значения (согласно постусловию MoveAssignable).
Поэтому мы будем обрабатывать удаление непосредственно в предикате. Обратите внимание, что мы также должны позаботиться о том, чтобы ничего не освободить дважды, поэтому мы будем отслеживать удаленный элемент с помощью std::unordered_set
void Directory::removeFile(BaseFile *file) {
std::unordered_set<BaseFile*> deleted_set { file }; // Just to avoid deleting the input argument if it's stored in children as well...
auto match_it = std::remove_if(begin(children), end(children),
[&](BaseFile *current_file) -> bool {
bool result = current_file->getName().compare(file->getName()) == 0;
if (result && end(deleted_set) == deleted_set.find(current_file)) {
delete current_file;
deleted_set.insert(current_file);
}
return result;
});
children.erase(match_it, end(children));
}
Наконец, я надеюсь, что указатель, который вы указываете в качестве аргумента file
, также не является членом children
, и если это так, то вы не закончите тем, что delete
используете его!
Примечание. Можно ли использовать интеллектуальные указатели в вашем случае? Кажется, что объект Directory
владеет объектами BaseFile
, хранящимися в children
... Так что, возможно, std::unique_ptr
поможет...
person
Rerito
schedule
14.11.2017
BaseFile
к вектору? - person alain   schedule 14.11.2017std::remove_if
для этой задачи. - person HMD   schedule 14.11.2017