2011-11-11 22 views
6

ベクトルから文字列を初期化しようとしています。私は出力として "ちょっと"を得るはずです。私は "セグメンテーションフォールト"を得ました。どうしたんだ?ベクトル<char>から文字列分割エラー

//write a program that initializes a string from a vector<char> 
#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 
int main() 
{ 
    vector<char> cvec; 
    cvec[0]='h'; 
    cvec[1]='e'; 
    cvec[2]='y'; 
    string s(cvec.begin(),cvec.end()); 
    cout<<s<<endl; 
    return 0; 
} 
+1

- [0] '' cvec (そして他のアクセス)は境界チェックを起動せず、ベクトルに要素がないので、まだ割り当てられていないメモリにアクセスしています。ありがとう、働いた。 – birryree

答えて

21

ベクトルクラスは、サイズがゼロ(デフォルト)から始まります。そのようにすると、未定義の動作が発生します。

(あなたの場合、セグメンテーションフォールトで)あなたが代わりにpush_back()を使用する必要があります。

vector<char> cvec; 
cvec.push_back('h'); 
cvec.push_back('e'); 
cvec.push_back('y'); 

これはベクトルに各charを追加します。

+0

または私はそれを初期化子で宣言しなければなりません。 "ベクトル cvec(1);" – ihm

+2

'push_back()'を使うと、それはうまくいきます。イニシャライザは必要ありません。 – Mysticial

+1

ベクトルをCスタイルの文字列として使用する場合は、 'cvec.push_back(0);'を追加して終了するヌル文字を追加できます。 –

11

あなたはこのように、ベクターにスペースを割り当てる必要があります。

vector<char> cvec(3); 

それとも一つ一つの文字を押す:Mysticialの答えに追加するには

vector<char> cvec; 
cvec.push_back('h'); 
cvec.push_back('e'); 
cvec.push_back('y');