Проблема:Как условно удалить элемент из списка с помощью итератора?
Я пишу простое приложение для файлового менеджера. В этой программе у меня есть «Directory» класс:
class Directory
{
public:
Directory(string address, string directoryname)
{
this->path = address;
this->name = directoryname;
}
string GetFullPath(){ return path == "/" ? path + name : path + "/" + name; }
string path;
string name;
string user;
};
и связанный список объектов каталога:
list<Directory*> DirectoryList;
Я хочу, чтобы реализовать команду "rm -r directorypath"
оболочки в Linux, так что мне нужно, чтобы просмотреть через список и удалить каталог «directorypath» и все его подкаталоги. Проблема в том, что я не знаю, как просмотреть список ссылок и удалить все каталоги, родительский каталог которых - «путь к каталогу». Я пробовал эти два метода:
метод 1:
Этот метод встречает ошибку во время выполнения, поскольку он не может получить доступ к списку больше после первого удаления.
for (auto address : DirectoryList)
if (address->GetFullPath() == directorypath)
{
for (auto subdirectory : DirectoryList)
if (subdirectory ->path == address->GetFullPath())
DirectoryList.remove(subdirectory);
}
Метод 2:
for (auto address : DirectoryList)
if (address->GetFullPath() == directorypath)
{
for (auto it = DirectoryList.begin(); it != DirectoryList.end();)
it = DirectoryList.erase(it);
return true;
}
этот метод может получить доступ ко всем элементам в совершенстве даже после удаления, но я не знаю, как проверить это, если условие с помощью итератора it
:
if (subdirectory ->path == address->GetFullPath())
Вы можете получить доступ к объекту, на который указывает итератор, с помощью '* it', т. Е. Он ведет себя как указатель. – niceguy
Прочитайте в [Erase-Remove Idiom] (http://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom) для безопасного и чистого подхода. – user4581301