为什么std::set.insert()返回一个非常量迭代器,而我却无法修改它
Why does std::set.insert() return a non-const iterator, and yet I cannot modify it?
考虑以下代码示例:
#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";
}
因此,撇开正确性不谈,比如不检查是否成功插入等等,这段代码看起来应该允许我在插入后修改字符串,但编译器(VS2010(禁止将迭代器解引用为非常量字符串(我们是从VS2005迁移过来的,它在没有警告的情况下处理这个问题(。
现在,我知道这应该被禁止,因为它可能会使字符串变得不唯一,我有点高兴它能以这种方式工作,但在现实世界中,它并没有那么清晰,因为我想修改一个不参与等价测试或排序的不可变数据成员。
我想知道的是,编译器如何知道我不被允许这样做,以及在没有参考文档的情况下我如何知道(文档中没有提到这一点(?
干杯,Guy
因为根据标准,通过不允许CCD_ 1。该标准特别允许CCD_ 2和CCD_相同类型。尽管不要求它们相同类型,它确实需要set<>::iterator
的value_type
为CCD_ 6。
当然,原因是对值可能使CCD_ 7的不变量失效。
来自标准:
23.3.3
集合是一种关联支持唯一密钥的容器(每个键最多包含一个值(,并提供快速检索钥匙本身。类集合支持双向迭代器。
这也是来自标准:
typedef实现定义迭代器;//见23.1
set::迭代器的实际实现是一个常量迭代器,以满足具有唯一键的要求。否则,您可以将集合中的值更改为所有相同的值。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- 修改 std::vector 会使迭代器无效吗?
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- C++ std::vector语言 - 如何修改迭代器指定的元素?
- 使用迭代器遍历向量并修改内容
- C++ 当容器在使用前被破坏/修改时发出警告(通过引用元素或迭代器使用)
- 如果我创建一个修改值的迭代器,静态成员"reference"应该是什么类型?
- std::map的迭代器,允许修改值,但不允许插入/删除
- 如何修改函数中的迭代器
- C++迭代器的未排序修改
- 使用迭代器修改容器的内容
- 使用std::vector::迭代器修改存储在std::vector中的值
- 检查/修改迭代器"constness"
- 通过迭代器修改集合中的元素
- boost-ptre如何使用迭代器修改XML
- 为什么std::set.insert()返回一个非常量迭代器,而我却无法修改它