迷いませんか?

プログラミング、電子工作、ゲーム・・・etc、色々やるけど中途半端なブログです。

vectorをinsertしようとしたらabortしたから原因と直し方

ボードゲーム枯山水を再びやりました
負けました ボロ負けでしたよ 苦手ですわ、アレ
ブロックスはたいていボロ勝ちできるんですけどねぇ・・・

vector結合しようとしたらabortした

とりあえず本題です
abortっていうのはアレですよ、
what(): vector::_M_range_insertってのが出てくるやつです
これをどうしたら直せるか、そもそもなる人が少なそうですけどね
起こるときの、例はこちらです

class Test{
private:
    vector<int> v;
public:
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    コンストラクタとか
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    vector<int> getVector();
};

int main(void){
    Test t;
    vector<int> v2; 
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    Testのvとv2は適当に初期化
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    v2.insert(v2.end, t.getVector().begin(), t.getVector().end());

    return 0;
}

こんな感じです
〜〜〜〜で区切ってるところは中略と思ってください
まあアタマの良くてベテランの皆様方ならすぐに原因がわかるでしょう
t.getVector()とやった時に返ってくる値は、vのコピーであるため、
一回目と二回目のt.getVector()は違うものなのです!!!
内容は同じかもしれないけれど、begin()、end()が変わってくるのです!!!
ならどうすればいいのか?

コピーが返ってくるならコピーを返さなければいいじゃない

ということです!
つまるところ、

//before
    vector<int> getVector();
//after
    const vector<int>& getVector();

でいいのです!!!!!!!
const参照を返す意味は察してください

これを探し出すために英語のサイトをめぐりめぐってましたよ(少し英語読める自慢)
なんか、ほとんどの人は英語読めるのかこんなプログラム書かないのか知りませんが
日本語のエントリがなかったのでとりあえず書いときました

それでは〜