2

基本的にベクトルを取得してファイルに書き込み、ファイルを開いてコンテンツを別のベクトルに書き込む次のコードがあります。

#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<bool> q, p;
//         ^^^^
    q.resize(5, 0);
    q[0] = 1;
    q[2] = 1;
    q[4] = 1;

    ofstream ofile("file.log");

    for (int i = 0; i<5; i++)
        ofile <<q[i]<<" ";

    ofile.close();

    ifstream ifile("file.log");

    p.resize(5);

    int i = 0;
//        vvvvvvvvvvvv
    while(ifile>> p[i])
    {
        cout <<i<<"\t"<<p[i]<<endl;
        i++;
    }

    ifile.close();

    return 0;
}

私が気付いたのは、ベクトルに double、int、および long データ型が含まれている場合、このコードは問題なくコンパイルおよび実行されますが、bool に変更するとエラーが発生することです。これは私が得るエラーメッセージです:

../src/timeexample.cpp:31: error: no match for ‘operator>>’ in ‘ifile >> p.std::vector<bool, _Alloc>::operator[] [with _Alloc = std::allocator<bool>](((long unsigned int)i))’

では、なぜこれが起こるのか誰か知っていますか?

ありがとうございました

4

2 に答える 2

6

std::vector<bool>スペース効率に特化しています。operator[]アドレス可能な変数を返すことができないため、std::vector<bool>::reference代わりにプロキシ オブジェクトを返します。一時変数に入力して転送するだけです:

bool b;
while (ifile >> b) {
    p[i] = b;
    cout <<i<<"\t"<<b<<endl;
    i++;
}
于 2013-05-09T19:39:27.910 に答える
1

vector<bool>あなたが考えるものではありません。これは std::vector の特殊化であり、要素の操作ではなくスペースに対して最適化され、boolビットを使用してbool値を表すことでストレージを削減しようとします。ビットが使用されると、ストリーム演算子は機能しなくなります。

最適化の重要な結果については、こちらを参照してください。

  • ストレージは必ずしも bool 値の配列ではありませんが、ライブラリの実装によってストレージが最適化され、各値が 1 ビットに格納される場合があります。
  • 要素はアロケータ オブジェクトを使用して構築されませんが、それらの値は内部ストレージの適切なビットに直接設定されます。
  • メンバー関数の反転とメンバー スワップの新しいシグネチャ。
  • bool 参照をエミュレートするインターフェイスを使用してコンテナーの内部ストレージ内の個々のビットにアクセスする特別なメンバー型である参照。逆に、メンバ型 const_reference は単純な bool です。
  • コンテナーによって使用されるポインターおよびイテレーターの型は、必ずしもポインターでも適合するイテレーターでもないわけではありませんが、予想される動作のほとんどをシミュレートする必要があります。

boolコンパイル時に値がいくつあるかわかっている場合は、この方法でintを使用できる別のデータ構造があります。

ストリーム演算子が定義されています。これが目的です。

于 2013-05-09T19:43:48.083 に答える