2

我收到这段简单代码的编译错误

“错误 1 ​​错误 C3892:'std::_Tree_const_iterator<_Mytree>::operator *':您不能分配给 const 变量”

std::set<int> s1;
std::set<int> s2;
std::set<int> s3;
std::set_union(s1.begin() , s1.end() , s2.begin() , s2.end() , s3.begin());

我跟着这个页面看不到我做错了什么。

http://www.cplusplus.com/reference/algorithm/set_union/

4

2 回答 2

4

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

std::inserter构造一个调用你的插入迭代器insert。但是,一种比以下更有效的方法std::set_union

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

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

于 2013-07-13T20:48:24.540 回答
4

一组中的项目是有效的const。您不能在集合中更改它们,因为这样做可能会更改它们相对于其他集合成员的顺序(这会违反不变量)。要修改一个项目,您通常将其从集合中移除,对其进行修改,然后将修改后的版本重新插入集合中(确保重新插入时它的顺序正确)。

至少如果内存服务,标准不要求 aset<T>::iterator等效于 a const_iterator,但确实允许它,并且您的编译器显然利用了这一点。

在任何情况下,您几乎肯定想要insert_iterator将算法的结果放入集合中。

std::set_union(s1.begin() , s1.end() , s2.begin() , s2.end() , std::inserter(s3, s3.begin());
于 2013-07-13T20:49:49.320 回答