10

C++ リファレンスによると、set::insert は、反復子が新しく挿入された要素、または存在する場合は既存の要素のいずれかを指すペアを返すと想定されています。

しかし、次の簡単な例が示すように、イテレータへの割り当てに問題があります。

int main() {
  set<int> set;
  *set.insert(5).first = 5;
  return 0;
} 

G++ と Clang を試しましたが、どちらも機能しません。

set.cc:7:24: error: read-only variable is not assignable
  *set.insert(5).first = 5;
  ~~~~~~~~~~~~~~~~~~~~ ^

ドキュメントには、反復子が const オブジェクトを参照する必要があることを示すものは何も見つかりません。また、型シグネチャにもこれを示すものはありません。これがうまくいかない理由を誰かが理解するのを手伝ってくれますか?

4

3 に答える 3

16

の場合std::set、関連するiteratorconst_iteratorタイプの両方が定数の双方向イテレータです。その理由は、std::set注文されたからです。イテレータを使用してセットの要素を変更すると、その順序が崩れます。

std::set順序付けられた要素を持つ を考えてみましょう{1, 4, 8}。その後、(許可されている場合)のようなことをした*set.insert(5).first = 10;場合、最初5に get に挿入され{1, 4, 5, 8}、次に挿入された要素が10get に設定されます{1, 4, 10, 8}。順序の不変条件は壊れています。

で挿入5しているinsert(5)ため、イテレータを逆参照して代入5する理由はありません。

于 2013-04-30T11:51:28.043 に答える
4

セットのメンバーをその場で変更することはできません。オーダーコンテナです。その反復子は代入できません。

于 2013-04-30T11:51:11.707 に答える
3

C++11 では、セット反復子は型を参照しconstます (セット参照を参照)。セットは順序付けされた要素を格納するため、考えてみれば理にかなっています。特定の要素を変更するだけで、順序付けの制約に違反する可能性が高くなります。

于 2013-04-30T11:51:53.747 に答える