簡體   English   中英

映射兩個鍵值

[英]Map with two key values

我有一個任務,我需要瀏覽文件夾中的所有文件。 對於每個文件,我需要知道每個唯一的文件擴展名,每個唯一文件擴展名的文件數以及每個唯一文件擴展名的總大小。 我必須能夠使用文件擴展名或文件擴展名的總大小對此進行排序。 我想到的第一件事是地圖。 這將跟蹤每個唯一的文件擴展名和找到文件擴展名的次數。 我現在如何將文件擴展名的總大小與我的地圖相關聯? 所以例如我需要輸出是這樣的:

使用文件擴展名排序.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。

您可以創建一個地圖:

 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 然后,您可以通過此數據結構回答兩個主要問題。

我會創建一個數據結構,例如ExtensionStat如下所示:

struct ExtensionStat {
  int totalFile;
  int totalSize;
};

並有一個從擴展名到地圖的地圖

map<string, ExtensionStat> extMap;

然后,您只需將收集統計信息的文件夾內容迭代到extMap 請記住,您不需要使用struct,也可以使用class。 您也可以選擇要map<string, ExtensionStat*> extMap; 如果你想避免全價值復制

您還可以使用多地圖

map<string, size_t> fileExtSizeMap;

簡單地為遇到的每個文件添加一個新條目。

std :: lower_bound和std :: upperbound可用於搜索此結構。 在生成的迭代器上使用std :: distance來獲取文件計數。

或者只是遍歷完整的地圖,隨時增加一個計數器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM