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

Vin*_*rta 1 c++ iterator const map

长话短说是有效的:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

它有效,我在这个问题中遇到过自己,在实际情况下,地图是两个类的地图,map<classA,classB>并且为了访问我必须的类的非const成员const_cast<classA&>(it->first).NonConstFunction(),这是我的第一个想法介意,这样做还可以,还是有更好的东西?

Jer*_*fin 8

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

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

  • @ViniyoShouta:地图按顺序维护它包含的项目.修改密钥时,它们可能不再有序.这取决于它们的顺序,所以如果它们不是,它将不再正常工作.unordered_map不会更好 - 它会根据键的哈希值存储一个值,因此当您更新键时,它需要重新计算哈希值并插入表中该哈希值的正确位置. (3认同)
  • @ViniyoShouta:如果ClassA中的元素根本没有参与比较操作,那么修改它们是安全的.将它们声明为`mutable`(这意味着"即使这个对象是const,这些成员也可能会改变).许多人都害怕这个结构. (2认同)