[英]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.