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 メソッドを使用できないと思いますが、別の簡単な方法はありますか?

4

1 に答える 1

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;

}

于 2013-08-01T01:37:51.500 に答える