1

簡単に言えば、それは有効ですか:

    map<int,int>m;
    m.insert( make_pair( 1, 40 ) );
    for( map<int,int>::iterator it = m.begin(); it != m.end(); ++it )
    {
        const_cast<int&>( it->first ) = 2;
    }

それは機能します、私はこの問題に遭遇しました。実際の場合、マップは2つのクラスのマップであり、クラスmap<classA,classB>の非定数メンバーにアクセスする必要がありましたconst_cast<classA&>(it->first).NonConstFunction()。これは私の頭に浮かんだ最初のアイデアでした心、これをしても大丈夫ですか、それとももっと良いことがありますか?

4

1 に答える 1

8

これは許可されていません。このようにキーをその場で変更すると、マップは値が変更されたことを「認識」しないため、データを保存するために内部で維持するツリー内の新しい位置にそのノードを移動する必要がある場合があります。ツリーがソートされなくなった場合、ツリーに対する他のほとんどの操作はクラッシュして焼き付く可能性があります。

正しく行うには、キーと値のペアのコピーを取得し、古いノードをマップから削除し、マップの外側でコピーを変更してから、変更したコピーをマップに挿入する必要があります。

于 2012-11-17T05:36:09.123 に答える