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

ところで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から型変換できる型だったためにエラーは起こらず。これだから添字で回るなと言ったのに。

スポンサーサイト
コメント
この記事へのコメント
vectorでiteratorを使うのは危険なんじゃないのかと思ってたのですが。揮発的な意味で。違うのかな。
2009/01/19(月) 00:51 | URL | tactom #-[ 編集]
iteratorを使うのは要素の参照と更新をしたいときだけだと思っています。なので揮発とか気にしなくてよいです。

と言いたいところですが、iteratorで回って要素をeraseすることはあります。iteratorが一つなら次のようにすればいいですが。
for (vector<T>::iterator it = v.begin(); it != v.end();) {
if (shouldErase(*it))
it = v.erase(it);
else
++it;
}
二重ループだったらこの手の事はできないので添字を回すしかありませんね。

一方、iteratorで回りながらpush_backとかしている人はちょっと自分が何をしているか考えたほうがいいと思います。
2009/01/24(土) 01:47 | URL | Gus #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/418-065ecad6
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。