1

現象を説明する理論をまとめましたが、もっと詳しい人に支えてもらいたいです。

クライアントコードには、次のものがあります。

vector<bool> candidates;
fillCandidates(candidates);

呼び出し先には、次のものがあります。

void fillCandidates(vector<bool>& candidates)
{
    // reserve space for two elements
    candidates.reserve(2);
    candidates[0] = true;
    candidates[1] = false;
    // here, candidates.size() == 0
}

関数のリターン後に候補のサイズを確認すると、0 です。何が起こっていますか?Ubuntu 12.04 64ビットのCMakeスクリプトで呼び出されたgcc 4.6.3を使用しています(ただし、これはすべて実際には無関係だと思います)。

注:私は答えとして私の解釈を提供しています。

編集:受け入れられた回答とコメントはタイミングで私を打ち負かしたので、私の解釈は何も追加しません。

4

1 に答える 1

4

予約ではなく、サイズ変更を呼び出す必要があります。

ここで違いを参照してください: vector::resize() と vector::reserve() の選択

以下のコメントに答えるために編集します。

短い答えはイエスです。予約されているだけのベクトルで operator[] を呼び出すとエラーになり、何かが起こる可能性があります。

長い答えは、この記事を読んでください http://www.gotw.ca/gotw/074.htm

v.reserve(2); v[0] = 1; v[1] = 2; 上記の行はどちらも完全なエラーですが、標準ライブラリの実装で何らかの形で「機能する」可能性が高いため、完全なエラーを見つけるのが難しい場合があります。

全体を読むことをお勧めします。あなたの場合push_back、手動でサイズ変更する代わりに使用します。ただし、本当に心配な場合は、パフォーマンスをベンチマークします。

于 2013-10-15T16:50:28.683 に答える