【发布时间】:2015-08-21 07:53:22
【问题描述】:
问题:
我正在编写一个简单的文件管理器应用程序。在这个程序中,我有一个“目录”类:
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;
我想在 linux 中实现"rm -r directorypath" shell 命令,所以我需要浏览列表并删除“directorypath”目录及其所有子目录。问题是我不知道如何浏览链接列表并删除其父目录为“directorypath”的所有目录。这两种方法我都试过了:
方法一:
此方法遇到运行时错误,因为它在第一次删除后无法再访问列表。
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 条件:
if (subdirectory ->path == address->GetFullPath())
【问题讨论】:
-
你可以用
*it访问迭代器指向的对象,也就是说,它的行为很像一个指针。 -
阅读Erase-Remove Idiom 以获得安全和干净的方法。
标签: c++ linked-list listiterator