gpt4 book ai didi

c++ - std::set 与自定义类型的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:07 29 4
gpt4 key购买 nike

我定义了我自己的结构体

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

最佳答案

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)),这是您真正想要的:从空填充一个集合。

关于c++ - std::set 与自定义类型的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8465885/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com