C++ 集合并集的编译错误
对于这段简单的代码,我得到了一个编译错误 “错误1错误C3892:'std::_Tree\u const\u iterator::operator*':您不能分配给常量变量”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())
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());