1

コンテナー内のデータにすばやくアクセスする方法が必要です。

だから私はそのデータ位置のイテレータを覚えています。その後、コンテナーは変更 (要素の追加と削除) される可能性がありますが、イテレーターを無効にしないコンテナー型 (std::mapまたは などstd::list) を使用する場合は問題ありません。

また、私のデータは (まだ) コンテナーにない可能性があるため、それcontainer.end()を反映するようにイテレーターを設定します。

end()要素が追加および削除されたときに変更されないことを保証する標準コンテナはどれですか? したがって、イテレータと によって返された値を比較しても、container.end()偽陰性になることはありません。

4

3 に答える 3

6

23.2.4/9 は連想コンテナについて次のように述べています。

insert メンバーと emplace メンバーは、イテレーターとコンテナーへの参照の有効性に影響を与えません。ererase メンバーは、イテレーターと消去された要素への参照のみを無効にします。

現在、「コンテナの要素へのイテレータと参照」を無効にしないことについて標準が話している場所がいくつかありますend()。これがその 1 つだとは思いませんend()。イテレータは「コンテナへのイテレータ」であると確信しています。

23.3.5.4/1 はstd::listinsertイテレータと参照の有効性に影響を与えない」と述べており、23.3.5.4/3 はerase「イテレータと消去された要素への参照のみを無効にする」と述べています。繰り返しますが、end()反復子は反復子であるため、その有効性は除外されません。

注意すべきことの 1 つは、どのコンテナーでswapも end() イテレーターを無効にできることです (これは、2 つの「自然な」動作があり、終了イテレーターが同じコンテナーの末尾を指すか、そうでない場合は末尾を指すためだと思います)。交換されたもののうち、標準はどれを指示したり、他の可能性を除外したりしたくない)。ただし、要素を追加したり削除したりするだけで、交換はしていません。

于 2013-03-14T16:30:47.127 に答える
3

私の経験から、消去または追加からのサイズ変更を繰り返し、サイズを変更するstd::vectorと中断します(これはのストレージにもstd::dequeue当てはまります)。また、メモリのブロックを割り当てないでください。通常、個々のノードを割り当てます(ほとんどの実装では、アイテムのリンクリストとしてバケットがあります(例))。std::stringstd::liststd::mapstd::unordered_mapstd::list

end()存続するイテレータが必要な場合は、 std::list(Signal / Slotsの実装、トークンに対してこれを行います)を選択するか、/を使用して独自の簿記を行いstd::vectorますstd::dequeue

編集:だから、std::listあなたのリスト自体が決して死なないという条件で、あなたのイテレータを常に有効にする良い方法です(彼らはそうではありません)。別の答えから、標準的な明快さが必要な場合:

23.3.5.4 / 1は、「イテレータと参照の有効性に影響を与えない」を挿入するstd :: listを示し、23.3.5.4 / 3は、eraseが「イテレータと消去された要素への参照のみを無効にする」と述べています。繰り返しますが、end()イテレータはイテレータであるため、その有効性は除外されません。-別の答え

于 2013-03-14T16:19:38.880 に答える
0

イテレータの代わりに、a を使用してvectorインデックス値を格納します。彼らはどんなリストラも生き残るでしょう。イテレータは主に、範囲を指定するペアで使用することを目的としています。見てきたように、個々のイテレータに固執するのは面倒です。

于 2013-03-14T16:19:48.583 に答える