2013-08-01 90 views
2

當前正在編寫一個程序,該程序將通過一個目錄進行解析(使用boost庫),並將文件擴展名,該特定類型文件的編號以及文件大小添加到包含字符串的地圖關鍵是一個班級。我現在正在嘗試查找每個文件擴展名的出現總數,目錄中找到的文件總數以及該目錄中找到的總字節數。計算地圖中的發生率

這裏是重要的代碼:

class fileStats 
{ 
public: 
    int totalFiles; 
    long long fileSize; 
}; 

map< string, fileStats > fileMap; 

fileMap[dirIter->path().extension()].totalFiles++; 
fileMap[dirIter->path().extension()].fileSize += file_size(dirIter->path()); 

我不認爲我可以使用地圖的.Count中的方法,除非我超載了,但有沒有這樣做的另一種更簡單的方法?

+0

如果你保持一個計數,而迭代在地圖上你可以指望在O(n)的發生。但是,如果您首先使用不同的數據結構,則可能會獲得更好的結果 – aaronman

+0

如果您必須使用某種邏輯計算總量,則可以迭代地圖,然後在元素符合條件時使用boost :: accumulator。 – Jepessen

回答

2

除非我錯過了一些東西,看起來好像你有一切隨時可用。擴展的總數爲

fileMap.size() 

然後你可以遍歷文件,該地圖的印刷數和字節數

for (auto i=fileMap.begin(); i!=fileMap.end(); ++i) 
    cout << i->first << '=' << i->second.totalFiles << ':' << i->second.fileSize << endl; 

這裏是打印總數的測試程序。

#include <iostream> 
#include <map> 

class fileStats 
{ 
public: 
    int  totalFiles; 
    long long fileSize; 

    fileStats() : totalFiles(0), fileSize(0) {} 
    fileStats(int f, long long s) : totalFiles(f), fileSize(s) {} 

    fileStats& operator+=(const fileStats& other) 
    { 
    totalFiles += other.totalFiles; 
    fileSize += other.fileSize; 
    return *this; 
    } 
}; 

int main(int argc, char* argv[]) { 
    typedef std::map< std::string, fileStats > map_type; 

    map_type fileMap; 

    fileMap["cpp"].totalFiles++; 
    fileMap["cpp"].fileSize += 11111; 

    fileMap["h"].totalFiles++; 
    fileMap["h"].fileSize += 22222; 

    fileMap["cpp"].totalFiles++; 
    fileMap["cpp"].fileSize += 33333; 

    fileStats totals; 
    for (map_type::const_iterator i=fileMap.begin(); i!=fileMap.end(); ++i) 
    totals += i->second; 

    std::cout << "total files=" << totals.totalFiles << ' ' << "total size=" << totals.fileSize << std::endl; 

    return 0; 

}

+0

好吧,解決找到擴展的數量,但我怎麼會找到totalFiles的總數,然後總的字節數?基本上我只是想將每個擴展的totalFiles添加到一起來知道目錄中的文件總數,然後將所有字節一起添加以獲得總數。 – Delete

+0

增加了平凡的總計算。 – skuzniar

+0

非常感謝您的幫助! – Delete