読者です 読者をやめる 読者になる 読者になる

Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

STL入門 第3回 ~list編~

スポンサードリンク

f:id:fa11enprince:20150731121156j:plain
過去のSTLの記事はこちら↓入門記事というよりただの自分の勉強記録になり下がってるのは仕様です。

listはSTLコンテナでvectorに似ています。シーケンシャルアクセスをサポートしています。前からも後ろからも。ただし、vectorのようなランダムアクセスはサポートしていません。要は配列のようにインデックスを指定してアクセスできないってことです。ベクターさんは後ろからパコパコbackが専門でしたが(あっ、途中からぶちこむinsertもあるよ!)、リストさんは前からもできちゃいます(*´Д`)!push_front!!insert!!
いや、vectorも前からinsertできるじゃないか?というのがありますが、そんなことしてしまうと、全部コピーしちゃうかららめぇ。えっ?でもinsertしたいんだよ!いれさせろよ!!(*´Д`)listにはmerge()やsplice()など便利なものがあります。今回はmerge()を紹介します。ソート済みの要素をくっつけてちゃんと整列されてるじゃん!っていう優れものです。
ちなみにlist::sort()はvector::sort()とは別物です。
下記では小数の比較用に独自クラスを作成しています。その際operator<()を定義しなくてはなりません。なお、演算子のオーバーロードですが、クラス内では二項演算子の場合引数は右辺のみです。たまにあれれってなります。クラス内の単項演算子の場合は引数なしです。クラスが2つあって、2クラス混ぜてその身長順に並べるってものです。

list::merge()のサンプル

実行結果

 148.09 158.01 171.11 172.38 173.91 181.02

ちゃんと整列されてますね。

ちなみにコンテナに動的確保した領域やそのポインタ入れたら解放どうするの?っていう話です。

std::vector<Foo *> vec;
vec.push_back(new Foo());

とか

std::vector<Foo *> vec;
Foo *foo = new Foo();
vec.push_back(foo);

とやった場合です。この場合、new Foo()で確保したものをやっぱり解放してやらないと確保し続けます。子供を産んだら面倒見ましょう。産みっぱなしはダメですよってやつですね。

コンテナにいれた領域を解放

実行結果

> ポケモン を つくりました
>> ヒトカゲ を つくりました
> ポケモン を つくりました
>> ピカチュウ を つくりました
ヒトカゲのHP は39
ひのこで こうげき
ピカチュウのHP は35
10まんボルト で こうげき
>> ヒトカゲ を けしました
> ポケモン を けしました
>> ピカチュウ を けしました
> ポケモン を けしました

例がアレでその設計どーよっていうのはかなりあると思いますが……。それはおいておいて、上記のようにポリモーフィズムを使いたい場合じゃない限り、ポインタ入れるのやめましょう。せめて生ポ使うなってところですかね。いやでも、国民は健康で文化的な最低限度の生活を営む権利を有するんだよ!!!
それにはスマポのshared_ptrを使うのがいいと思います。上記の例もスマポで置き換えられます。

スマートポインタを使った例(抜粋)