我为班级做了最后的作业。关键是我们需要像文件浏览器一样使用树。我试图这样做,但我陷入了排序的困境(因为我们需要按大小,名称,日期等进行排序)。
我创建了一个名为File的类,并为该对象建立了索引。但是我意识到我无法按照我想要的标准对那棵树进行排序。我如何仅使用该树(或可能不使用树)按特定过滤器排序并打印所有数据(名称,大小,日期)。
void BuscarArchivos() {
string path;
cout << "Ingrese la ruta: "; //type the path
cin >> path;
Archivo * arc2;
string test;
for (const auto & entry : fs::directory_iterator(path)) {
test = entry.path().string();
arc2 = new Archivo(test);
tree->Insert(arc2); //indexing the file class
}
}
void ImprimirArchivo()...
我想按条件对文件树进行排序。
答案 0 :(得分:0)
对于每个标准,构建一个AVL树作为索引。索引仅用于引用存储在其他存储位置中的文件对象。
using Size = uint64_t;
using Name = std::string;
// using Data = whatever;
struct Node {
Size size; // file size
Name name; // file name
Data data; // whatever data
explicit Node(const std::string &path) { /*omitted*/ }
// construct from path
}
// Tree<Key, Data>
Tree<Size, std::shared_ptr<Node>> indexed_by_size_tree;
Tree<Name, std::shared_ptr<Node>> indexed_by_name_tree;
Tree<Data, std::shared_ptr<Node>> indexed_by_data_tree;
void Build() {
std::string path;
std::cin >> path;
for (const auto &entry : fs::directory_iterator(path)) {
auto node = std::make_shared<Node>(entry.path().string());
indexed_by_size_tree.Insert(node->size, node); // size as key
indexed_by_name_tree.Insert(node->name, node); // name as key
indexed_by_data_tree.Insert(node->data, node); // data as key
}
}
void TraverseOrderedBySize() {
for (auto iter = indexed_by_size_tree.begin();
iter != indexed_by_data_tree.end(); iter = std::next(iter)) {
// deal with iter->key
}
}