我已经定义了自己的结构

struct element {

int id;
float value;
}

我正在使用它与std::set 我想使用set_difference算法(就像上一个问题中已经提到的那样,用于确定两个集合的区别。当我尝试调用代码时,编译会停止,并显示以下错误消息:

/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());

===============>>#1 票数:12 已采纳

set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
               std::inserter(s3, s3.begin()));
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

示例: http//ideone.com/B4Cc1

通过将s3.begin()作为输出迭代器,您将意味着要使用设置差异覆盖集合的前区域。 覆盖要求集合的大小大于结果,这在大多数情况下显然不正确; 即使set不为空,也不能使用s3.begin()作为输出,因为迭代器是只读的(否则会破坏排序的顺序)。

OTOH, std::inserter(x, cit)意味着,只要指定了这个输出迭代器( *it = y ),就会调用insert方法( x.insert(cit, y) ),这就是你真正想要的:从空填充一个集合。

  ask by Eric translate from so

未解决问题?本站智能推荐:

关注微信公众号