gpt4 book ai didi

c++ - 遍历对象列表 C++

转载 作者:行者123 更新时间:2023-11-30 03:21:17 26 4
gpt4 key购买 nike

基本上,我正在为一个类项目创建一个基本的 shell 程序。我坚持遍历目录中的文件/文件夹。

我的错误在函数 DisplayDirectoryContents() 中

class Directory 
{
private:
map<string, pair<list<Folder>, list<File> > > directoryContents;
string directoryPath;

public:
list<Folder> getFolders() {return directoryContents[directoryPath].first;}
list<File> getFiles() {return directoryContents[directoryPath].second;}
string getDirectoryPath() {return directoryPath;}

Directory()
{
directoryPath = "root/";
File *file = new File("Test");
directoryContents[directoryPath].second.push_back(*file);
}
void DisplayDirectoryContents()
{
// Get files and folders from directory
list<File> files = this->getFiles();

for(int i = 0; i < files.size(); i++)
{
cout << files->getFileName(); << Error here
}

}
};

我试过用几种不同的方法来设置这个函数,但我似乎无法获得正确的代码来让它工作。

我认为这会起作用,但每次我尝试弄乱 DisplayDirectoryContents() 函数时都会抛出错误。有没有人有任何提示可以帮助我解决这个问题?谢谢

class File
{
string fileName;
string fileTime;
public:
string getFileTime(){return fileTime;}
string getFileName(){return fileName;}

void setFileTime(){time_t now = time(NULL);
fileTime = ctime(&now);}
void setFileName(string newFileName){fileName = newFileName;}
File(){}
File(string fName)
{
fileName = fName;
time_t now = time(NULL);
fileTime = ctime(&now);
}
void MakeFile(string fName);
void RemoveFile(string fName);
};

最佳答案

扩展到 R Sahuanswer :

您不能使用原始循环进行迭代的原因是 std::list 不提供索引运算符(您需要使用 std::vector 代替) .

基于范围的 for 循环的替代方法(不过,我更喜欢这种方法,除非你有特定的理由不这样做)——或者如果你没有可用的 C++11 的方法——使用迭代器:

for(std::list<File>::iterator i = files.begin(); i != files.end(); ++i)
{
std::cout << i->getFileName();
}

使用 C++11,您可以使用 for(auto i = files.begin(); ...

即使在 C++11 中使用迭代器循环的用例也可以将项与其后继项进行比较:

// check for empty list first, as std::prev would fail on!)
for(auto i = files.begin(); i != std::prev(files.end()); ++i)
{
if(someCondition(*i, *std::next(i))
{
// do something else
}
}

已经有 std::remove_if for 并且您应该更喜欢它(连同 lambda;但不要忘记在之后应用 erase,请参阅 erase-remove-idiom !),仅供说明;从更简单的方法开始:

for(auto i = files.begin(); i != files.end(); ) // no ++i (!)
{
if(condition)
{
i = files.erase(i);
// fine for std::list; with std::vector, if removing more
// than one single element, we'd move or even copy subsequent
// elements multiple times, which is quite inefficient
}
}

改进的变体(std::remove_if 也是这样做的):

auto pos = files.begin();
for(auto i = files.begin(); i != files.end(); ++i)
{
if(!condition)
// ^ (!)
{
*pos++ = std::move(*i);
}
}
// here, std::remove_if already stops, but returns pos...
files.erase(pos, files.end());

移动或复制赋值运算符可能仍然存在未正确处理自赋值的最小问题,这将在 if(!condition && i != pos) 中涵盖。

关于c++ - 遍历对象列表 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52196514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com