2012-04-30 4 views
6

Qtにはマップをリストするのに似たクラスがあります。これらのクラスは、const_iteratorを返すbegin_const()メソッドを提供します。ドキュメンテーションによれば、これらのconst_iteratorsは、より速いので可能な限り使用する必要があります。イテレータとconst_iterator(STL)の効率が異なる

STLは、インスタンス自体がconstの場合にのみ、const_iteratorを提供します。 1つのbegin()メソッドだけが実装されています(constのためにオーバーロードされています)。

iteratorとconst_iteratorを使用して要素に読み取りアクセスするときに違いはありますか?(なぜQtに違いがあるのか​​分かりません)

+2

古代のstlから現在のバージョンのC++標準ライブラリに切り替えると、const_iteratorsを返すcbegin関数が得られます。また、イテレータをconst_iteratorに割り当てることができ、beginのconstバージョンもconstイテレータを返すことに注意してください(すべてC++標準ライブラリ用)。 – PlasmaHH

+0

私の参照はcplusplus.comでした。 cbegin()はありません。あなたは素敵で最新のSTLリファレンスを教えてくれますか?今では、cbegin()メソッドがあるので、今質問はもっと迫っています... – HWende

+0

PlasmaHHが指し示す関数はC++ 11の一部です:[記事](http://www.cplusplus.com/articles/EzywvCM9 /)しかし、constイテレータの代わりにイテレータを使用するためのパフォーマンス上の問題があるかどうかはわかりません。 – Uflex

答えて

5

これらのconst_iteratorsは、より高速なので可能な限り使用する必要があります。

確かにあります。 http://qt-project.org/doc/qt-4.8/containers.html#stl-style-iteratorsから:各コンテナクラスの

、2 STLスタイルのイテレータタイプがあります提供1読み取り専用アクセスと、読み取り/書き込みアクセスを提供するアクセス権があります。読取り専用イテレータは、読取り/書込みイテレータよりも高速であるため、可能な限り使用する必要があります。

どのような愚かなことを言う。

安全ですか?はい。もっと早く?これが当てはまる場合(gccとclangでは明らかにそうではありません)、const以外のものよりconstイテレータを好む理由はほとんどありません。これは早すぎる最適化です。 const以外のものに対してconstイテレータを使用する理由は安全です。あなたが指し示す内容を変更する必要がない場合は、constイテレータを使用します。いくつかのメンテナンスプログラマーがあなたのコードに対して何をするか考えてみてください。

cbeginまでは、C++ 11の追加です。これにより、autoキーワードはconst以外の設定であってもconstイテレータを使用できます。

+0

だから何とかQtに違いがあっても、私はC++には何もないと仮定します。私はまた、パフォーマンス上の理由から通常の/ constをunsingしないことに同意します。明確な声明をありがとう! – HWende

3

constを使用する最もよい理由は、バグを避けて、コードの意図をより明確にすることです。

コンパイラは、非constイテレータでは不可能な最適化をいくつか実行することが考えられます。エイリアシング(複数の変数とパラメータが同じオブジェクトを参照する場合)は、しばしば最適化の阻害要因となります。コンパイラがconst-iteratorが決して値を変更できないことに気づいて、いくつかの形式のエイリアシングを除外することができれば、多分最適化が可能になるでしょう。

一方、フロー解析で同じ結論に達するには、そのような方法でconstを使用するのに十分なコンパイラが必要です。

関連する問題