2017-02-20 16 views
0

私は、次のような初期化リストでコンストラクタを持っている場合:理解ベクトルの初期化

std::vector<int> _list; 

Program::Program() : _list(0) 
{ 
} 

これは、ベクターは、それ自体のサイズを変更しても、0にすべての値を初期化していますか?

+0

あなたの質問は分かりません。あなたが掲示したベクトルはエントリーを持っていません - ベクトルはちょうどそれ自身でサイズ変更しません。 'push_back'、' insert'、 'emplace_back'、' resize'のように、ベクトル関数の1つを呼び出す必要があります。これらの関数を呼び出すと、ベクトルに配置されるものを制御しています。 – PaulMcKenzie

+4

SInce leading underscoreは、グローバル名前空間内の実装のカスタム識別子に使用される規則であり、通常は独自の識別子では避けられます。メンバ変数の一般的な規約はBoostライブラリで使用されているもので、末尾にアンダースコアがあります。 –

+0

質問を明確にしてください。 –

答えて

1

あなたが呼んでいるベクトルコンストラクタの引数を誤解しているようです。 _list(0)は、型intのデフォルト値を使用して_listを長さゼロに初期化します。これは、ゼロになることもありますが、ベクトルに要素が含まれていない場合は関係ありません。明示的に要素の値をゼロに設定しません。おそらく、コンストラクタに指定された回数だけ単一の値を繰り返させることを意図していたでしょうか?その場合は、最初の引数として目的の長さを渡し、2番目の引数の値を繰り返し渡す必要があります。この構造体は、ベクトルを展開するためのサイズ変更には影響しません。新しいベクトル要素をデフォルト値(またはvector::resizeに追加引数として指定した場合は別の値)に設定します。ここ

は、第一の長さ5のために繰り返す値10でベクトルを初期化コードに基づいて、説明する例です、その後長さのベクトルのサイズを変更10.

#include <iostream> 
#include <vector> 

class Program 
{ 
public: 
    Program() : _list(0) { } 
    Program(unsigned long size, int value) : _list(size, value) { } 

    void ResizeList(unsigned long size) 
    { 
     _list.resize(size); 
    } 

    void PrintList() const 
    { 
     std::cout << "_list = "; 
     for (const auto& val : _list) 
     { 
      std::cout << val << ", "; 
     } 
     std::cout << std::endl; 
    } 

private: 
    std::vector<int> _list; 
}; 

int main() 
{ 
    Program p(5, 10); 
    p.PrintList(); 

    p.ResizeList(10); 
    p.PrintList(); 

    return 0; 
} 

出力:

_list = 10, 10, 10, 10, 10, 
_list = 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 
+0

これを実際に初期化する必要はありませんあなたがリストとしてそれを使用しているのならば、そうですか?ちょうどpush_back項目とあなたは良いですか? – Koszuta

+0

空になるようにしたい場合は、それが正しいです。他の初期化を指定しない場合(それを所有するクラスのコンストラクタ内のメンバ初期化子リストから省略した場合)、 'push_back'を使用して必要な値を追加することができます。 –

+0

ベクトルにサイズ変更を使用すると、追加される要素は0になりますか? – Koszuta

0

あなたはthe documentation for the std::vector constructorを見れば、あなたはコンストラクタ(3)、あなたが使用している1のために、あなたは_listでインプレースタイプint0要素を構築していることがわかりますことがわかります。これはあなたが本質的に何もしていないことを意味します。

resize関数を使用しない限り、ベクトルがサイズ変更されると、スペースが割り当てられる要素は初期化されません。この場合、要素はデフォルト値または選択した値に初期化されます。例えば

あなたのベクトルが空だったとあなたは_list.resize(10);をした場合、_listは今ちょうど0であるべき、intのデフォルト・構築タイプの10個の要素が含まれます。 _list.resize(10, 5);の代わりに_listに10 5が含まれるようになりました。

私はこれがあなたのために物事をクリアするのを助けてくれることを願っています。フォローアップの質問がある場合は、お気軽にお問い合わせください。

関連する問題