2013-08-01 4 views
2

В настоящее время вы пишете программу, которая будет анализировать через каталог (используя библиотеку ускорения) и добавлять расширения файлов, номер этого типа файла и размер файлов на карту, которая включает в себя строку и ключ - класс. Теперь я пытаюсь найти общее количество вхождений для каждого расширения файла, общее количество файлов, найденных в каталоге, и общее количество байтов, найденных в каталоге.Counting Occurrences In A Map

Вот важный код:

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, когда элементы yuour соответствуют вашим условиям. – 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 на расширение вместе, чтобы узнать общее количество файлов в каталоге, а затем добавить все байты вместе, чтобы получить общее для этого. – Delete

+0

Добавлено тривиальное вычисление итогов. – skuzniar

+0

Большое спасибо за помощь! – Delete