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

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

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

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

スポンサーサイト
コメント
この記事へのコメント
挙動が異なるのでしょうか
2009/01/14(水) 01:19 | URL | tactom #-[ 編集]
記憶によると、
0. at は配列のサイズチェックを行うが、operator[] はしない、という違いがある。
1. data は標準でなかったかと。
2. でも、vector はメモリー上に連続で並んでいることが保証されている。
だったと思いますが、何しろ詳しくないので。
2009/01/14(水) 04:26 | URL | 白のカピバラ #wr.8gKW6[ 編集]
初めまして。

C++ Referenceの方にはvector#atが載っているようです。
http://www.cppreference.com/wiki/stl/vector/start
標準という扱いで良いと思います。

参照に関しては、普段はiteratorを使い、operator[]やatは極力避けるのが最良だと思います。
ですがどうしてもインデックス参照を使わなければならないのであれば、基本的にoperator[]を使い、範囲チェックで例外が欲しい時にatを使う、というのはどうでしょうか。

ところで、定数参照ではなく、敢えてポインタを経由するということは
(つまり、
template <class T>
(..., const vector<T>& v, ...)
ではなく、わざわざ非推奨の手法である
template <class T>
(..., vector<T> *v, ...)
としているのは)
恐らくvの中身を破壊的に変更したいという要求と、vが破壊的に変更されるのだということを呼び出し側に明示的に伝える要求があるためだと推察致しましたが、どうなのでしょうか。
2009/01/14(水) 14:47 | URL | S_Nakayama #Luan/x1w[ 編集]
こんなにコメントが。ちょっとニュアンスが落ちていたので日記で補足します。そして返答。

>>tatcomさん
白カピさんの返答が正解です。

>>nucさん
1. dataはちょっと勘違いしていました。調べてみます。他はその通り。

>>S_Nakayamaさん
そうですね。
実際に書いていたのは、vectorを出力するアルゴリズムで、その内部で出力するvectorにランダムアクセスする必要がありました。ちょっとiteratorの出番はありませんでしたね。
それからvector<T>*の理由はご察しの通りです。手が滑ってvector<T>& vじゃなくてvector<T>* vを選んでしまったということもありますが。
2009/01/15(木) 00:00 | URL | Gus #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/416-0bc92edb
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。