const_cast是否对地图的关键值有效?

时间:2012-11-17 05:32:00

标签: c++ map iterator const

长话短说是有效的:

    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;
    }

它有效,我遇到过这个问题,在实际情况下,地图是两个类map<classA,classB>的映射,并且访问类的非const成员{{1这是我想到的第一个想法,这样做是否还可以,或者更好

1 个答案:

答案 0 :(得分:8)

这是不允许的。当您像这样就地修改密钥时,映射将不会“意识到”该值已更改,因此可能需要将该节点移动到其内部维护的树中的新位置以存储数据。如果树不再排序,树上的几乎任何其他操作都可能崩溃并烧毁。

要正确执行此操作,您需要获取键/值对的副本,从地图中删除旧节点,在地图外修改副本,然后将修改后的副本插回地图。