特定のシナリオでは、ファイルを std::vector
std::ifstream testFile("testfile", "rb"); std::vector<char> fileContents; int fileSize = getFileSize(testFile); fileContents.reserve(fileSize); testFile.read(&fileContents[0], fileSize);
ただし、このアプローチは、reserve() でベクターのサイズを変更すると失敗します。実際に要素をベクトルに挿入するわけではないためです。その結果、fileContents[0] にアクセスしようとするとエラーが発生します。
より包括的な解決策には、イテレータの使用が含まれます。入力ファイル ストリームを使用すると、次のスニペットにより効率的なファイルの読み取りが可能になります。
#include<iterator> //... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), std::istreambuf_iterator<char>());
このアプローチでは、istreambuf_iterator を利用して入力ファイル ストリームを反復処理し、要素をベクトルに直接挿入します。
再割り当てが懸念される場合は、reserve() を使用して、 Vector:
#include<iterator> //... std::ifstream testFile("testfile", std::ios::binary); std::vector<char> fileContents; fileContents.reserve(fileSize); fileContents.assign(std::istreambuf_iterator<char>(testFile), std::istreambuf_iterator<char>());
このバリエーションでは、reserve() を使用して既知のファイル サイズに基づいてスペースを割り当て、assign() を使用して反復子を使用してベクトルを設定します。
以上がファイルを std::vector に効率的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。