0

かなり大量の変数を格納するブール データ コンテナーを実装する必要があります。char*C スタイルのマクロ アクセサーを使用して実装することもできると思いますが、それをstd::構造体でラップすることをお勧めします。std::bitset<size_t>コンパイル中のサイズが固定されているため、実用的ではないようです。

それで、std::vector<bool>スペースに最適化されたものが残ります。そして、素敵な bool のようなアクセサがあります。

  1. それからポインタを直接フィードするようなことをする方法はありますfwrite()か?

  2. そして、そのようなベクトルへのファイル入力をどのように行うのでしょうか?

  3. 最後に、大量のファイル I/O が必要な場合に適切なデータ構造ですか?

  4. ランダムファイルアクセス(fseekなど)はどうですか?

編集:std::vector<unsigned int>私の要件で要求される機能を持つ新しいクラスで a をラップすることにしました。

4

2 に答える 2

6
  • それからポインタを直接fwrite()にフィードするようなことをする方法はありますか?

いいえ、しかしあなたはそれを行うことができますstd::fstream

std::ofstream f("output.file");
std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
  • そして、そのようなベクトルへのファイル入力をどのように行うのでしょうか?

使用するstd::fstream

std::ifstream f("input.file");
std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
  • 最後に、大量のファイル I/O が必要な場合に適切なデータ構造ですか?

いいえ、vector<bool>どのような目的にも適したデータ構造であることはめったにありません。http://howardhinnant.github.io/onvectorbool.htmlを参照してください。

  • ランダム ファイル アクセス (fseek など) はどうですか?

それはどうですか?

于 2013-05-14T13:15:41.763 に答える
2

を使用してstd::vector<char>、ファイルのサイズ (または、固定長ブロックを処理したいなどの他のサイズ) にサイズ変更し、その内容を次のような関数fread()またはfwrite()次の方法で渡すことができます。

std::vector<char> fileContents;
fileContents.resize(100);
fread(&fileContents[0], 1, 100, theFileStream);

これにより、サイズ変更可能な char 配列を C++ スタイルで使用できるようになります。おそらく、それは有用な出発点ですか?ポイントは、配列のように順番に配置されることが保証されているため、ベクトルの背後にあるメモリに直接アクセスできることです。

同じ概念が aでも機能しstd::vector<bool>ます。プラットフォーム (8 ビット vs 16 ビット vsたとえば、マイクロコントローラで作業している場合は 32 ビット)。freadsizeofbool

std::vector<bool>各 bool を単一のビットに格納するように最適化できるようです。そのため、動作することがわかっている場合を除き、メモリを直接使用しようとしないvector<bool>でください。

于 2013-05-14T12:11:59.707 に答える