2016-04-08 10 views
1

なぜこのプログラムがクラッシュしますか?これは、ラインvec[0].assign("blabla");にクラッシュ:string :: assignは文字列のベクトルでは機能しません

#include <vector> 
#include <string> 
using namespace std; 

int main() 
{ 
    vector<string> vec; 
    vec.reserve(5); 
    vec[0].assign("blabla"); 
} 

またはこの:

#include <vector> 
#include <string> 
using namespace std; 

int main() 
{ 
    vector<string> vec; 
    vec.reserve(5); 
    vec[0].push_back('a'); 
} 

そして、何それは実際に動作しない場合は代わりに使用するのが最適でしょうか?

答えて

1
vector<string> vec; 
vec.reserve(5); 
vec[0].assign("blabla"); 

これは未定義の動作を引き起こします。 vec[0]は予約されていますが割り当てられていません。代わりにpushまたはemplaceを使用する必要があります。


vector<string> vec; 
vec.reserve(5); 
vec[0].push_back('a'); 

同じエラー。メモリにまだ存在しないvec[0]にプッシュしています。


ソリューション:

vector<string> vec; 
vec.reserve(5); 
vec.emplace_back("blabla"); //or push_back 

または:

vector<string> vec; 
vec.resize(5);// Notice resize not reserve 
vec[0].assign("blabla");//this works now since vec[0] is exist 

または:

vector<string> vec; 
vec.resize(5);// Notice resize not reserve 
vec[0].push_back('b'); //this works now since vec[0] is exist 

私がやるませは第2のオプションを優先する。なぜならそれはN回の構築を引き起こし、次にN回の割り当てを行うからである。

関連する問題