c ++ 0x中不可变的set-key,在哪里?

时间:2011-05-01 15:17:43

标签: stl iterator c++11 containers

我在一次演讲中听说C ++ 0x 关联容器中的密钥不再是 mutable 。之前,在C ++ 03中,它们是可变的,只有标准的文本说,订单或密钥必须保持不变。

现在,幸运的是,这是非法的:

std::set<int> ss { 2,5,1,6,8,5,8,0,2,4,9 };
auto it = ss.find(4);
*it = 7;  // 'ERROR: assignment of read-only location'

这个变化在C ++ 0x中反映在哪里?我查看了最终草稿,但仍然看到find()并返回iterator - 听起来可以修改。 (为什么会这样,而且我必须猜测:像map这样的容器想要修改。修改了 -part常量?)

2 个答案:

答案 0 :(得分:5)

N3290中的23.2.4 / 5表示:

  

对于setmultiset值   type与密钥类型相同。对于   mapmultimap等于   pair<const Key, T>。钥匙在   关联容器是不可变的。

和23.2.4 / 6说:

  

对于关联容器,其中   值类型与键相同   类型,iterator和。{   const_iterator是不变的   迭代器。
...
注意:   iteratorconst_iterator有{{1}}   在这种情况下相同的语义

此引号是否解决了您的问题?

答案 1 :(得分:1)

基本上,iteratorconst_iterator现在指定为相同。当然,这是低级,而不是技术性,但set容器在C ++ 0x中将iterator类型设置为const_iterator是完全合法的。

对于map,当然是pair<const K, V>,所以它从来没有问题。