C++の最大の利点はSTLだという。最近これを実感したので、たまらず記事にしたくなった。これがこのブログのきっかけだ。
listは重複する値の削除のメソッド .unique()とソート処理の.sort()がまず便利だ。もう配列は使わないでいいかも、と思ってしまう。
mapと組み合わせることで、list<pair<int,double> > mylist;
実装は、mylist.pushback(make_pair(11,2.2));
読み出しは、list<pair<int,double> >::iterator mylist_p; を宣言しておいて、
mylist_p->firstとすると11が、mylist_p->firstとすると2.2が読み出されるのは知っておいて損はない。
こうすることで2つの値をもつリストを作れるので、簡単な表計算っぽいことが簡単にできる。
はい、次です。
ファイルの読み込みを行いつつ計算などをする場合、はまるので注意。
つまりファイル全体を読むのに、末尾まで読むという定番の処理while(!myifstream.efo()) をやりつつ読んだ結果を出力すると、なんと最終行が重複するのだ。
たとえば、読み込みファイルの中身が
1
2
3
4
これを上のようにEOFまで読み出すようにすると、こうなる:
1
2
3
4
4
一行多いのです。平均値を求める場合などはこれに気づかないで単純に足していったりするとおかしくなります。というか私はこの処理をやっていてどうにもおかしく、構文上理解不可能なバグだったので悩んだ末、いろいろ調べてようやくこの問題に気づきました。
これはC++の仕様どおりだそうだが、これは欠陥ではないのか?直すべきだと思われる。
今日は以上。