我已经定义了自己的结构
struct element {
int id;
float value;
}
我正在std::set
使用它。我想使用set_difference
算法(如a previous question中已经提到的那样)来确定两组的差异。当我尝试调用代码时,编译停止并显示以下错误消息:
/usr/include/c++/4.2.1/bits/stl_algobase.h:268: error: passing
'const element' as 'this' argument of 'element& element::operator=(const element&)'
discards qualifiers
最小的例子可能如下所示:
std::set<struct element> s1;
std::set<struct element> s2;
std::set<struct element> s3;
element e1 = { 1, 11.0 };
element e2 = { 2, 22.0 };
element e3 = { 3, 33.0 };
s1.insert(e1);
s1.insert(e2);
s2.insert(e2);
s2.insert(e3);
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), s3.begin());
答案 0 :(得分:12)
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(s3, s3.begin()));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
通过将s3.begin()
作为输出迭代器,您将意味着希望覆盖具有设置差异的集合的前部区域。覆盖要求集合的大小大于结果,这在大多数情况下显然不正确;即使set不为空,也不能使用s3.begin()
作为输出,因为迭代器是只读的(否则会破坏排序的顺序)。
OTOH,std::inserter(x, cit)
意味着,只要分配了这个输出迭代器(*it = y
),就会调用insert方法(x.insert(cit, y)
),这就是你真正想要的:填充a从空设置。