循环访问对象列表 c++
Iterating over a list of objects c++
基本上,我正在为一个类项目创建一个基本的shell程序。我坚持遍历目录中的文件/文件夹。
我的错误在函数 DisplayDirectoryContent(( 中
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
}
}
};
我尝试以几种不同的方式设置此功能,但我似乎无法获得正确的代码来使其工作。
我认为这会起作用,但是每次我尝试弄乱DisplayDirectoryContent((函数时,它都会给我带来错误。有没有人有任何提示,我可以尝试帮助解决这个问题?谢谢
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 Sahu 答案的扩展:
无法使用原始循环进行迭代的原因是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
,你应该更喜欢它(与 lambda 一起; 但不要忘记在之后应用erase
,请参阅擦除-删除-成语!(,所以只是为了说明;从更简单的方法开始:
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++11 或更高版本,则可以使用范围for
循环来循环列表的内容。
void DisplayDirectoryContents()
{
// Get files and folders from directory
list<File> files = this->getFiles();
// Iterate over each item in the list.
// Use a reference to avoid copying of the items.
for ( File& file : files )
{
cout << file.getFileName();
}
}
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题