std::unordered_set::equal_range
値のキーが等しいと比較されるセット内の値の範囲を記述するイテレータのペアを返します。与えられた:
auto iteratorFromEqualRange = someUnorderedSet.equal_range(key).first;
auto iteratoFromFind = someUnorderedSet.find(key);
規格によって次のことが保証されていますか?
++iteratorFromEqualRange == ++iteratorFromFind;
どちらもstd::unordered_set::iterator
?で定義されているため 言い換えれば、別の実装では、反復しているものstd::unordered_set
のコンテキストに関する「隠された」情報を保持できますか、それともこれはバケットインターフェイスのそれほど微妙な強制ではありませんか(実装オプションが制限されます)?
LegacyForwardIteratorの要件を考えると、これは確かに保証であると思います。確認を求めているだけです(または、ある種のエスケープハッチを含むより良いニュース)
のイテレータはForwardIteratorunordered_set
(現在はLegacyForwardIteratorという名前)です。
C ++ 14標準(最終ドラフトn4140)は、フォワードイテレータに関して次のように述べています。
24.2.5フォワードイテレータ[forward.iterators]
1クラスまたはポインタ型
X
は、次の場合にフォワードイテレータの要件を満たします
...
(1.5)—型のオブジェクトは、以下で説明するX
マルチパス保証を提供します。
..。3 2つの逆参照可能なイテレータ
a
とb
タイプX
は、次の場合にマルチパス保証を提供します。(3.1)—はを
a == b
意味し++a == ++b
、
(3.2)—X
はポインタ型または式(void)++X(a)
で*a
あり、式と同等*a
です。
この場合、(1.5)と(3.1)を組み合わせると++iteratorFromEqualRange == ++iteratorFromFind;
、これらのイテレータの両方を逆参照できるという条件で、標準によって保証されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加