「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > イテレータを介して C++ std::set 内の要素を変更することが悪い考えであるのはなぜですか?

イテレータを介して C++ std::set 内の要素を変更することが悪い考えであるのはなぜですか?

2024 年 11 月 24 日に公開
ブラウズ:209

Why is Modifying Elements in a C   std::set Through Iterators a Bad Idea?

C でのセット要素の変更の影響

反復子を使用して std::set の要素を変更すると、基になる要素の動作に関する懸念が生じる可能性がありますデータ構造。

要素の結果変更

MSDN ドキュメントによると、セットに格納されている値を直接編集することは強く推奨されません。値を変更すると、次の理由から予測できない動作が発生する可能性があります。

  • セットの実装は、順序付けのキー値として保存された値に依存します。値を変更すると、データの順序が無効になります。
  • ほとんどの実装では、データの管理に赤黒ツリーが使用されます。要素を明示的に削除して再挿入せずに値を変更すると、要素がツリー内で誤って配置され、検索操作で不正確な結果が得られる可能性があります。

未定義の動作の例

次の仮定の例を考えてみましょう:

std::set mySet = {1, 2, 3};
auto it = mySet.find(1);

// Modify the value stored in the set
*it = 4;

このシナリオでは、変更された要素 (値 4) は、赤黒ツリー内で無効な位置になります。その結果、セットに対する後続の検索操作が失敗するか、間違った結果が返される可能性があります。

結論

std::set オブジェクトの整合性を維持するには、次のことが重要です。保存された値の直接変更を避けるため。代わりに、既存の要素を削除し、適切なデータ順序を確保し、未定義の動作を防ぐために、必要な値を持つ新しい要素を挿入します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3