20

私が理解していることから、size_typeandの目的difference_typeは単なる記号ではありません。たとえば、サイズが異なるセグメント化されたアーキテクチャなどに対処することも意図されていました。

そのコンテキストで、ランダム アクセス イテレータを含むコンテナーがある場合、いずれかがキャストされたときに 常に と等しくなければならないという理由で、そのと の値のstatic_cast間で自由に実行しても安全ですか?difference_typesize_typeend() - begin() size()

(たとえば、2 つのイテレータ間の要素数と同じサイズのコンテナを作成する場合や、その逆の場合: 特定のサイズのコンテナをイテレータで区切られた範囲にコピーする場合などに使用されます。)

キャストする前に注意すべきことはありますか (データの損失など)?

4

2 に答える 2

13

C++ 11標準がさまざまなことについて述べていることは次のとおりです。

§ 23.2.1

Expression: difference_type
Return Type: signed integer type
Operational Semantics: -
Assertion/note, pre-/post-condition: is identical to the difference type of iterator and const_iterator
Complexity: compile-time

Expression: size_type
Return Type: unsigned integer type
Operational Semantics: -
Assertion/note, pre-/post-condition: size_type can represent any non-negative value of difference_type
Complexity: compile-time

Expression: size()
Return Type: size_type
Operational Semantics: distance(begin(),end()) 
Assertion/note, pre-/post-condition: -
Complexity: constant

size()が同等であることを確認しましょうend() - begin():

§ 24.4.4/4

distance():
Effects: If InputIterator meets the requirements of random access iterator, 
returns (last - first); otherwise, returns the number of increments needed 
to get from first to last

コンテナーにはランダム アクセス イテレーターがあるため、これは当てはまります。それはそれです。最初のボックスでわかるように、

size_type can represent any non-negative value of difference_type

それから、キャスト from difference_typetosize_typeはすべての非負の値に対して有効である必要があることがわかりました。

于 2012-07-26T01:05:05.433 に答える
2

常に安全とは限らないと思います。この歴史的な問題は、C 言語の最初の仕様以来存在しており、ptrdiff_tが の正の範囲全体をカバーすることが保証されていませんsize_t。明らかな理由から、この問題は の仕様に引き継がれstd::vectorます。

標準の C++ コンテナでは、 がsize_typeの非負の範囲をカバーすることが保証されていますdifference_typeが、逆のカバレッジは保証されていません。

size()ただし、標準コンテナに対するとの関係はend() - begin()、他の方法で保証できます。実装は、関数を通じて公開される最大コンテナー サイズに独自の制限を自由に課すことができcontainer::max_size()ます。最大サイズを人為的に制限して、減算がオーバーフローしないようにすることができます。

difference_typePSの存在理由は単なる記号であり、他には何もないと思います。完全に「安全」にdifference_typeするには、 よりも 1 ビット長くする必要がありsize_typeます。多くの場合、これを実際に実現するのは困難です。そのため、言語仕様で要求されていません。

于 2012-07-26T00:50:31.737 に答える