11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

vectorのresizeとassignの違い

Posted at

c++のvectorではresizeassignという機能があります。
僕は今までresizeではサイズの指定だけ、assignはサイズと中身、とイメージしていたんですがresizeでも要素を指定できることを知ったので忘れないために違いを書いておこうと思います。

※簡単のためstd::を省略しています。

resize

長さが伸びた場合
vector<int> a={1,2,3};
a.resize(5);

このようにするとaの中身は{1,2,3,0,0}になります。resizeで増えた分は0になります。

長さが縮んだ場合
vector<int> a={1,2,3};
a.resize(1);

このようにするとaの中身は{1}になります。resizeで指定した長さになるまでeraseが行われるらしいです。

驚いたやつ

長さが伸びた場合
vector<int> a={1,2,3};
a.resize(5,10);

これが僕がこの記事を書こうと思った原因です。resizeって名前だから長さしか指定できないだろうと思ったらそんなことありませんでした。
このようにするとaの中身は{1,2,3,10,10}になります。埋める際に指定した要素になります。縮んだ場合は要素を指定しても変わりません。

assign

長さが伸びた場合
vector<int> a={1,2,3};
a.assign(5,1);

このようにするとaの中身は{1,1,1,1,1}になります。assignでは全ての要素を指定した要素で埋めます。

長さが縮んだ場合
vector<int> a={1,2,3};
a.resize(5,1);

このようにするとaの中身は{1}になります。伸びた場合と同様です。

おまけ
vector<int> a;
a.assign({1,2,3,4,5});

vector<int> b;
b.assign(a.begin(),a.end());

リストでassignやほかのvectorのイテレータなどもassignは受け取ります。

あとがき

resizeassignでメモリが解放されるわけではないことに注意が必要です。

メモリの確保
vector<int> a={1,2,3,4};
a.push_back(5);

とした場合、配列の中身は{1,2,3,4,5}と5要素しかありませんがメモリ領域は6要素分確保されています。元が4,追加で2なので6です。新しく追加した場合はもともとのメモリ領域分の半分が新たに確保されます。

余分なメモリの解放
a.shrink_to_fit();

先ほどの状態からこのようにするとメモリ領域が5要素分になります。使っていないメモリを開放することができます。
また、

余分なメモリの解放(古い)
vector<int>().swap(a);

このようにswapのメンバ関数で使っていないメモリの解放をすることができます。新しくvector配列を作って中身を移動させています。

参考にさせていただいたサイトの方々です。より詳しく書かれています。2つ目の記事はvectorそのものを開放したい場合に参考にしてください。

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?