我在一次演讲中听说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常量?)
答案 0 :(得分:5)
N3290中的23.2.4 / 5表示:
对于
set
和multiset
值 type与密钥类型相同。对于map
和multimap
等于pair<const Key, T>
。钥匙在 关联容器是不可变的。
和23.2.4 / 6说:
对于关联容器,其中 值类型与键相同 类型,
iterator
和。{const_iterator
是不变的 迭代器。
...
注意:iterator
和const_iterator
有{{1}} 在这种情况下相同的语义
此引号是否解决了您的问题?
答案 1 :(得分:1)
基本上,iterator
和const_iterator
现在指定为相同。当然,这是低级,而不是技术性,但set
容器在C ++ 0x中将iterator
类型设置为const_iterator
是完全合法的。
对于map
,当然是pair<const K, V>
,所以它从来没有问题。