我收到这段简单代码的编译错误
“错误 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());
我跟着这个页面看不到我做错了什么。
我收到这段简单代码的编译错误
“错误 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());
我跟着这个页面看不到我做错了什么。
s3.begin()需要包裹在std::inserter(s3, s3.begin()).
std::inserter构造一个调用你的插入迭代器insert。但是,一种比以下更有效的方法std::set_union:
s1.insert(s2.begin(), s2.end());
除非你不想修改s1并且想要一个单独的集合。
一组中的项目是有效的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());