週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

呼吸器系(喉、鼻)がおかしいのでお休みをとりました。熱と咳はないものの、会議とかに出ると流行り病を起こしそうなので安全策をとったというところです。

先週末に仕事しすぎた可能性は否めません。週末なのに朝早く起きて健康的に過ごせたと思ったのですが。1:00に寝て8:00に起きるのは社会人の週末としては健康的ではないのかも。

とりあえず今日は二セットほど寝てました。あとは文法の本を進めたりとか。仕事をしてしまうのでコンピュータには触れないでおきました。

スポンサーサイト

ある問題にStern-Brocot treeが利用できることに気がついてびっくりしました。そもそもStern-Brocot Treeを知ったのが一ヶ月前のThe 1st Imos Contestですが。この木に実数の有理数化以外の使い道があるなんて。

ちなみに何に利用できたかは秘密です。

Stern Brocot treeについては以下を参照:

ところでvectorでoperator[]よりconst_iterator使った方がいい理由って何でしたっけ。どわすれ。

以前、vectorの値を埋めるときにoperator[]で埋める代わりにpush_backに書き換えたところ、ミスを誘発したということがあります。たしか次のようなテーブルを作っている時で、f(0)は使わないからi = 0をi = 1に書き換えてしまって構わないとかやったときでした。

for (int i = 0; i < n; ++i)
    t.push_back(f(i));
教訓としては、インデックスの値と内容が強く結びついている場合はoperator[]したほうがいいという感じです。


1/24追記。

v[i]と書くべきところをiと書いてしまうミスをやりました。Tがintから型変換できる型だったためにエラーは起こらず。これだから添字で回るなと言ったのに。

コメントありがとうございます。

元々は(*v)[i]が非常に面倒という話を書きたかったはずなのですが、今読み返してみるとそこがすっかり抜け落ちていますね。

そもそもデリファレンスするときに(*a)と書くのが非常に面倒なのです。優秀な->オペレータはどこへ行ってしまったのでしょう。類似品に(*it)->hogeがあります。正直この表記はconst_iteratorよりもはるかに面倒です。const_iteratorは確かに長くて面倒ですが、使うときは補完するので問題はありません。一方で(*a)と書くのは割とキーボー ドに優しくないです。

そんなことを考えていたら、v->at(i)(*v)[i]と長さが大差なくて、むしろatの方が書きやすいことに気づいてしまったといったところです。そんな驚きを書きたかったのですが、原文ではまったくもってそこが抜け落ちていますね。反省。

コメントをくださった人へのまとめ。

  • atメソッドは範囲外アクセスに対して例外を投げます。operator[]はチェックをしません。
  • vector.dataはヘッダファイルから発見したので例として上げましたが、私の中では完全にstring.dataと混同していました。
  • atはいつ入ったのでしょうか。c++98?
  • atがどのくらい遅いのか書いたほうがいいかもしれませんがあいにく今は眠いです。
  • vectorはメモリ上に連続することが保証されています。More Exceptional C++のp. 47, Item 7の解説にあります。あるいはHerb Sutterのコメントかな。

vector<T>* v;を受け取ってインデックス参照をする場合、(*v)[i]v->at(i)のどちらがより望ましいのでしょう。私ならかなりの確率でvector<T>& ref = *v;としてrefをつかいますが。

さらにstlのvectorのページにはatやdataが載っていません。ここを参照するのに危険があるとは思いませんでし た。

stl-manualにも載っていません。c++/bits/stl_vector.hを見れば確実ですが。

はてな出張所をみてください。500が解けないので非常にどんよりしています。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。