6

Qt には、マップを一覧表示する同様のクラスがあります。これらのクラスは、const_iterator を返す begin_const() メソッドを提供します。ドキュメントによると、これらの const_iterators は高速であるため、可能な限り使用する必要があります。

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

iterator と const_iterator を使用して要素を読み取りアクセスする場合に違いはありますか? (Qtでそれらに違いがある理由はわかりません)

4

2 に答える 2

5

ドキュメントによると、これらの const_iterators は高速であるため、可能な限り使用する必要があります。

確かにそうです。http://qt-project.org/doc/qt-4.8/containers.html#stl-style-iterators から:

各コンテナー クラスには、2 つの STL スタイルの反復子型があります。1 つは読み取り専用アクセスを提供し、もう 1 つは読み取り/書き込みアクセスを提供します。読み取り専用反復子は、読み取り/書き込み反復子よりも高速であるため、可能な限り使用する必要があります。

なんてばかげたことを言うのでしょう。

より安全?はい。もっと早く?これが事実であったとしても (明らかに gcc と clang ではそうではありません)、非 const イテレーターよりも const イテレーターを好む理由はめったにありません。これは時期尚早の最適化です。非定数イテレータよりも定数イテレータを好む理由は、安全性です。ポイント先のコンテンツを変更する必要がない場合は、const イテレータを使用します。保守プログラマーがコードに対して何をするかを考えてみてください。

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

于 2012-04-30T12:01:48.307 に答える
3

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

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

一方、フロー分析で同じ結論に達することができるように、そのようにconstnessを使用するのに十分優れたコンパイラーを期待します。

于 2012-04-30T16:19:28.747 に答える