C++ 为什么std::set.insert()返回一个非常量迭代器,但我无法修改它?
考虑以下代码示例:C++ 为什么std::set.insert()返回一个非常量迭代器,但我无法修改它?,c++,visual-studio-2010,stl,iterator,set,C++,Visual Studio 2010,Stl,Iterator,Set,考虑以下代码示例: #include <set> #include <string> using namespace std; set<string> string_set; void foo(const string& a) { pair<set<string>::iterator, bool> insert_result = string_set.insert(a); string& val
#include <set>
#include <string>
using namespace std;
set<string> string_set;
void foo(const string& a)
{
pair<set<string>::iterator, bool> insert_result = string_set.insert(a);
string& val = *(insert_result.first);
val += " - inserted";
}
#包括
#包括
使用名称空间std;
设置字符串\u集;
void foo(常量字符串和a)
{
对插入结果=字符串集插入(a);
string&val=*(插入_result.first);
val+=“-插入”;
}
因此,撇开正确性不谈,比如不检查插入是否成功等等,这段代码看起来应该允许我在插入后修改字符串,但编译器(VS2010)禁止将迭代器解引用到非常量字符串(我们从VS2005迁移,它在没有警告的情况下将其传递)
现在,我知道这应该被禁止,因为它可能会使字符串变得非唯一,我很高兴它能以这种方式工作,但在现实世界中,它并没有那么明确,因为我想修改一个不参与等价性测试或排序的不可变数据成员
我想知道的是,编译器如何知道我不允许这样做,以及我如何知道不参考文档(文档中没有提到这一点)
干杯,
Guy来自标准:
23.3.3
集合是一种关联的
支持唯一密钥的容器
(每个键最多包含一个。)
值),并提供快速检索
钥匙本身。类集
支持双向迭代器
这也是标准:定义了typedef实现 迭代器; //见23.1
set::iterator的真正实现是一个常量迭代器,以保持对具有唯一键的需求。否则,您可以将集合中的值更改为所有相同的值。因为根据标准,通过 不允许使用
set::iterator
。该标准明确规定:
允许set::iterator
和set::const_iterator
作为
同一类型。虽然这并不要求它们是一样的
类型,它确实需要set::iterator
的value\u type
来
beconst
当然,这样做的原因是对
值可能会使
std::set
的不变量无效。我认为它不会返回const\u迭代器,我认为它是第一个成员,即const。@Michael标准说它是实现定义的。看见edit@Michael:对于集合
,没有第一个
,我想你把它和地图
混淆了,它存储了对
。Matthieu M.,对。因为我可能在某处见过基于地图的集合实现;-)