今回はvectorの話です。
c++を使い始めてからそろそろ2年ぐらいになります。
最初のころはc++要素のないプログラムを書いていたのを覚えています。
「c++ 入門」で検索をかけ、
cout、cin?printfとscanfがあるじゃんw
class?なにそれww
と、cしか知らなかった当時の私は早々に挫折したものです。
そんな中出会ったのがvectorでした。
当時の私は
「大きさのわからない配列を作るときはとりあえず100個の配列を作りなさい。」
「100個もあれば大体は事足りるから」
と習っていました。
そして、実際に100個の配列を作っては「なんかダッサイなー」と思っていたのです。
それをvectorが
「待たせたな!配列の大きさ?知らねえな。好きなだけ突込みな!」
と言ってくれたのですから、私はもうvectorに夢中でした。
vectorを使い始めたころはpush_backが大好きでした。
好きなだけデータを追加できますからね。
しかしある時、ある程度大きなデータを扱うプログラムを組むことになりました。
そのときもvectorにpush_backでデータを追加していたのですが、
データを追加するだけで1,2分かかるのです。
何とかならないかと試行錯誤した末にたどり着いた結論が、
「resizeしてindexを使ってデータを書き込めばいい」というものでした。
この手法でデータ追加にかかる時間は10秒程度に抑えられました。
index用の変数を用意しないといけないのが気にくわなかったのですが^^;
それからしばらくして、stlのalgorithmの存在を知りました。
いえ、正確には存在はすでに知っていたのですが、
引数がイテレータだったり、関数が多くて内容を把握できていなかったりで敬遠していたのです。
どういう心境の変化かは忘れましたがalgorithmを使い始めるようになって、
それからvectorの存在が一回り大きくなりました。
このころからresizeしてindexでデータを書き込む、、、ということはしなくなりました。
vectorのサイズはコンストラクタを使って初期化するようになり、
データの書き込みはalgorithmのtransformを使うようになったのです。
vector便利、vectorぱねぇwと調子に乗ってた頃に壁にぶつかりました。
コンストラクタを使って初期化をすると、実体ができちゃうんですよね。
その時は実体を作りたくなかったので、どうしたもんかと悩んでいた時です。
reserveの価値に気づいてしまったのです。
例えるなら、resizeが家を建てる、reserveが土地を用意する、といったところでしょうか
reserveを使えばpush_backを使っても遅くならない!実体も作られない!完璧!
さらにさらにback_inserterというものがあります。
これをalgorithm関数の引数に渡せば勝手にpush_backしてくれるというスグレもの。
こうしてreserveに気づくまで2年という年月がかかってしまいました、という話です。^^;
vectorの強みはpush_backでデータを追加できることだと思います。
そしてpush_backを有効に使うためにreserveがある。
これからc++始めるぞっていう方には2年も無駄にしないでほしいですね^^;
(っていうか2年も無駄にした私がahoだったのか、、、^^;)
[c++]vector奮闘記
Re: [c++]vector奮闘記
予言:
データ個数が不明な状態下において vector.reserve() に与えるべき引数に困り,
「一旦listに全部push_backしてから,vectorにassignする」コードとか書いたあげく,
何の工夫もせずにvectorにpush_backするコードと比較したら後者の方が遥かに動作早かったりして
> vectorぱねぇw
ってなったりするであろう.
データ個数が不明な状態下において vector.reserve() に与えるべき引数に困り,
「一旦listに全部push_backしてから,vectorにassignする」コードとか書いたあげく,
何の工夫もせずにvectorにpush_backするコードと比較したら後者の方が遥かに動作早かったりして
> vectorぱねぇw
ってなったりするであろう.