std::使用自定义类型设置差异

std::set difference with self defined type

本文关键字:设置 类型 自定义 std      更新时间:2023-10-16

我已经定义了自己的结构,例如

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());
set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
               std::inserter(s3, s3.begin()));
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

示例:http://ideone.com/B4Cc1

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

OTOH,std::inserter(x, cit)的意思是,每当分配此输出迭代器(*it = y(,插入方法将被调用(x.insert(cit, y)(,这才是您真正想要的:从空填充一个集合。