いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

勝手にまとめ(でも長文)

9月だー orz
……コーディングの進みが悪い…。そそくさとやらなければ……。
さて、昨日の map::operator const の件ですが、epistemeさんに色々指摘していただきまして、勉強になった点等があったので、ちょぃとまとめて(?)みようかと思います。(殆ど受け売りになってしまいますが…)

とりあえず map::operator
の仕様は「keyが無かった場合、自動で増える」なので

typedef std::map<string, int> tMap;

tMap mapInst;
mapInst["Manna"] = 18;  // |
mapInst["Laura"]  = 13;  // + mapの内容が増える

int GetAge(const tMap& mapInst, const string& strKey)
{
  return mapInst[strKey];
  // ↑これがOKだと、strKeyが無かった場合、
  // constなのに内容が増えてしまう!!
}

なるほど。確かにこりゃダメですな。値が変わってしまっては、const じゃ無くなってます。

では map::operator const があった場合、勝手に増えないような実装をすれば良いじゃんとか思ってみますが、この場合、keyが無いときは何の値を返せば良いのか?という問題が発生してしまいます。一致するものが無かった以上、既存の値は返せませんし、const なのでpairの追加は出来ないため、困り果ててしまうわけです。


よって、ちょぃと実装がムリそう。出来たとしても、若干ややこしくなったり、実装にムリが出そうですな…


さて、若干話が脱線しますが 「operator で値が増えるのはどーなんだろう?」と、私が前回の日記でレスしてますが、どーも私的には operator で「追加」という動作は、微妙な感じがしてしまいます。普通の配列のように、値を「参照/更新」するというイメージが強いためでしょう。
確かに operator
を使った方が見た目スマートだとは思うんです。

mapInst["Misya"] = 14;
mapInst.insert(tMap::value_type("Hina", 18));

後者は、ぱっと見ゴチャゴチャしてます。解りづらいかもしれません。ですが、私は insert という文字列が心地よいわけですよ!(笑) 「あぁ、新規追加ね」と言う感じがでてて良い感じだと思うのです。…が、こんなことを感じてしまうのは、私だけなんでしょうかねぇ…

この辺りは、プログラマの好き好みなんでしょうなぁ。若干効率の差があるようですが、今の時代は無視できると思いますし。
…ただ、insert派は少なさそうだなぁ…(苦笑


とりあえず、話を戻しつつまとめるとー

・map::operator は新規pairを追加をする可能性があるので、const状態だと使うに使えない。
・map::operator
const を追加しようにも、keyが無い場合何の値を返せば良いのか解らないため、途方に暮れてしまう。

と言う所でしょうか、
epistemeさんが指摘してくれたため、この辺に気づくことが出来ました。ありがとうございます。^^
おかげで夜はぐっすり寝れそうです。

…が、最近は昼間に寝てたり…。^^;