C++ 集合并集的编译错误

C++ 集合并集的编译错误,c++,C++,对于这段简单的代码,我得到了一个编译错误 “错误1错误C3892:'std::_Tree\u const\u iterator::operator*':您不能分配给常量变量” std::set s1; std::set s2; std::set s3; std::set_union(s1.begin()、s1.end()、s2.begin()、s2.end()、s3.begin()); 我看不出我做错了什么 s3.begin()需要包装在std::inserter(s3,s3.begin())

对于这段简单的代码,我得到了一个编译错误

“错误1错误C3892:'std::_Tree\u const\u iterator::operator*':您不能分配给常量变量”

std::set s1;
std::set s2;
std::set s3;
std::set_union(s1.begin()、s1.end()、s2.begin()、s2.end()、s3.begin());
我看不出我做错了什么

s3.begin()
需要包装在
std::inserter(s3,s3.begin())

std::inserter
构造一个插入迭代器,它为您调用
insert
。 但是,比std::set_union更有效的方法是:

s1.insert(s2.begin(), s2.end()); 

除非您不想修改
s1
并且想要一个单独的集合。

集合中的项目实际上是
const
。不能在集合中更改它们,因为这样做可能会更改它们相对于其他集合成员的顺序(这将违反不变量)。要修改项目,通常需要将其从集合中删除、修改,然后将修改后的版本重新插入集合(确保插入时的顺序正确)

至少在内存可用的情况下,标准并不要求
set::iterator
等同于
const_iterator
,但确实允许它,而且编译器显然利用了这一点

在任何情况下,您几乎肯定需要一个
insert\u迭代器
,将算法的结果放入集合中

std::set_union(s1.begin() , s1.end() , s2.begin() , s2.end() , std::inserter(s3, s3.begin());
std::set_union(s1.begin() , s1.end() , s2.begin() , s2.end() , std::inserter(s3, s3.begin());