映射两个键值

时间:2013-03-30 04:06:36

标签: c++ map

我有一项任务,我需要浏览文件夹中的所有文件。对于每个文件,我需要知道每个唯一的文件扩展名,每个唯一文件扩展名的文件数以及每个唯一文件扩展名的总大小。我必须能够使用文件扩展名或文件扩展名的总大小对此进行排序。我想到的第一件事是地图。这将跟踪每个唯一的文件扩展名和找到文件扩展名的次数。我现在如何将文件扩展名的总大小与我的地图相关联?所以例如我需要输出如下:

使用文件扩展名进行排序 .cpp:1:3400 .exe:3:3455600 .mp4:25:200000404

使用总文件扩展名大小进行排序 .mp4:25:200000404 .exe:3:3455600 .cpp:1:3400

以下是我编辑后的代码:

    #include <iostream>
    #include <filesystem>
    #include <map>

    using namespace std;
    using namespace std::tr2::sys;

    class fileInfo {
    public:
        int fileCount;
        long long fileSize;
    };

    void scan(path f)
    {
        map<string, fileInfo> fileMap;
        cout << "Scanning = " << system_complete(f) << endl;
        directory_iterator d(f);
        directory_iterator e;
        for( ; d != e; ++d)
        {
            path p = d->path();
            cout << "\nExtension is: " << extension(p) << "\tFile size is: " << file_size(p) << endl;
            fileMap[extension(p)].fileCount ++;
            fileMap[extension(p)].fileSize += file_size(p);
        }

        for (map<string, fileInfo>::iterator it = fileMap.begin(); it != fileMap.end(); ++it)
        {
             cout << it->first << " : " << it->second.fileCount << " : " << it->second.fileSize << endl;
        }
    }

    int main(int argc, char* argv[] )
    {
        path folder = "..";

        scan(folder);

        return 0;
     }

编辑:所以我已经实现了类fileInfo。它有点工作。但是我遇到了file_size的问题。在第一次运行循环之后,它正确返回file_size,但是对于每个其他运行循环,file_size返回0。

3 个答案:

答案 0 :(得分:0)

您可以创建一个地图:

 map<string, vector<int> > fileExtToSizeMap;

基本上,对于string格式的每个文件扩展名,如果当前文件与该扩展名相关联,请将文件大小放入向量vector<int>。扫描完目录后,该向量的大小将告诉您how many files are associated with the file extension,向量的总和将告诉您the total size for each unique file extension。然后,您可以通过此数据结构回答两个主要问题。

答案 1 :(得分:0)

我会像这样创建一个数据结构,例如ExtensionStat

struct ExtensionStat {
  int totalFile;
  int totalSize;
};

并有一个从扩展名到地图

的地图
map<string, ExtensionStat> extMap;

然后,您只需将收集统计信息的文件夹内容重复到extMap。请记住,您不需要使用struct,也可以使用class。如果您想避免全价值复制,也可以选择地图为map<string, ExtensionStat*> extMap;

答案 2 :(得分:0)

您也可以使用多地图

map<string, size_t> fileExtSizeMap;

简单地为遇到的每个文件添加一个新条目。

std :: lower_bound和std :: upperbound可用于搜索此结构。在生成的迭代器上使用std :: distance来获取文件计数。

或者直接遍历完整的地图,在你去的时候递增一个计数器。