ホームページ > バックエンド開発 > C++ > ファイルを std::vector に効率的に読み取るにはどうすればよいですか?

ファイルを std::vector に効率的に読み取るにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-09 18:13:02
オリジナル
192 人が閲覧しました

How to Efficiently Read a File into a std::vector?

std::vectorへのファイルの効率的な読み取り

特定のシナリオでは、ファイルを std::vector に読み取ります。不必要なコピーやオーバーヘッドを避けるためには、効率的に行うことが重要です。 1 つのアプローチでは、reserve() メソッドを使用してベクターにスペースを割り当て、続いて read() を使用してベクターを設定します。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート