2017-01-17 14 views
0

私は実際にはstd :: vectorの単純なコピーを実装しようとしています。私のテストでは、私のデータが元のものと比較して一貫しているかどうかを確認するために何か気づいた。ここstd :: vector resize algorithm

std::vector<std::string> *v = new std::vector<std::string>(2); 
std::string str1("Hello"); 
std::string str2("World"); 

v->push_back(str1); 
v->push_back(str2); 

v->resize(5); 

for (std::vector<std::string>::const_iterator it = v->begin(); it != v->end(); it++) 
{ 
    std::cout << "/" << (*it) << "/" << std::endl; 
} 

は結果である:サイズ変更は、このようなのstd ::文字列()さんを追加しない理由

// 
// 
/Hello/ 
/World/ 
// 

誰かが私に説明できます:

は何
/Hello/ 
/World/ 
// 
// 
// 

アルゴリズムの背後にある?

+0

デバッガでプログラムをデバッグしたときに何を確認しましたか? – SergeyA

答えて

9

鍵はここにある:

std::vector<std::string> *v = new std::vector<std::string>(2); 

これがデフォルトで構築されている要素、(意味 - 2つの空の文字列)を持つベクトルを作成します。次に、あなたはpush_backHelloWorldです。今あなたは4つの要素を持っています。次に、resize(5)は要素を1つだけ追加します(デフォルト構成も可能)。

私は容量を操作したいと思っていましたか?代わりにstd::vector::reserveが必要です。


空のベクターを作成し、次に動作を確認するには、push_backを使用する必要があります。または、push_backの代わりにoperator[]を使用してください。


スタック上ではなくヒープ上にベクターを作成する本当に良い理由はありますか?あなたは(ほとんど?)常にこれを避けるべきです。

+0

コンストラクタがどのように動作するのか分からなかったので、このケースではコンストラクタが容量を増やすと思っています。 –

+1

@ClémentJean - 容量を増やしたい場合は、 'std :: vector :: reserve'が必要です。 –

+0

ok私はそれをチェックして実装します。スタック上での作成のために –

2

内部に2つのアイテムを持つstd :: vectorを構築していますが、デフォルトで構築されています。
参考:と

std::vector<std::string> *v = new std::vector<std::string>(2); 

を::std::vector constructors

置き換え

std::vector<std::string> *v = new std::vector<std::string>(); 

そして、ところで、なぜあなたが新しいと、ヒープ上のベクトルを割り当てていますか? と同じようにそれを宣言:

std::vector<std::string> v; 
1

ベクトルの構築では、引数として2を渡しました。ここでは、その中の2つのデフォルト構築した文字列とベクトルを作成し、ベクターに他の二つの文字列をプッシュしている

explicit vector(size_type _Count) 

:あなたがその建設を見てみる場合は、これを見ることができます。 デフォルトの構成を使用し、std::vector::reserveを使用してベクトルの容量を増やします。次に、あなたのサイズ変更およびループについては行く

std::vector<std::string> *v = new std::vector<std::string>({"s1","s2"}); 

:以下を試してみてください、あなたが見たいと思っている結果を得るために

2

。これはあなたが示唆したように期待されるパディングを与えるはずです。

関連する問題