STLを使っていて,やってしまったミスを記録していきます.

アルゴリズム

アルゴリズムを使っていてやってしまったミス.

std::copyでコピーに失敗

下のようなコード*1を書いた時
なぜか思ったように文字列がコピーされません.

    string Str;
    char Source[]="hoge";
    copy(Source, Source+4, Str.begin());
    cout << Str << endl;            //何も出力されない

最初,何が悪いのかさっぱり分かりませんでした.
しばらく悩んだ後,stringのメンバを見てみると,困った事にsizeが0のままです.
そこで,resize(4)をコピーの前に加えてみるとうまく動きました.

    string Str;
    char Source[]="hoge";
    Str.resize(4);                //resize
    copy(Source, Source+4, Str.begin());
    cout << Str << endl;            //出力される

このようなイテレータで要素を加えていくアルゴリズムの場合
copyに限らず移動先の要素数が,加える要素数よりも少ないと意図した動作になりません.
わざわざresizeするのがめんどくさい場合は,inserterを使う事で解決する事もできます.

    string Str;
    char Source[]="hoge";
    copy(Source, Source+4, back_inserter(Str));    //inserter
    cout << Str << endl;                //出力される
    return 0;

inserterを使うことで,要素を追加する際ににpush_back等のメソッドで追加してくれます.

コメント


お名前:

*1 もうちょっと変な事をしていましたが