gpt4 book ai didi

c++ - 插入期间容器 std::set 的行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:58 25 4
gpt4 key购买 nike

插入集合时,集合内部是否多次删除了某些对象?我试图在下面的程序中插入两个 MyClass 类型的对象,但令我惊讶的是它调用了具有初始插入值的类的析构函数 2 次!我无法理解这背后的任何逻辑。任何人都可以对输出给出一些想法吗?(突出显示为粗体)

#include<stdio.h>
#include<stdlib.h>
#include<set>

using namespace std;

struct MyClass
{
double num;

~MyClass()
{
printf("Destructor called..for val: %lf\n", num);
}
};

typedef int (*fun_comp)(MyClass, MyClass);

int
comp(MyClass a, MyClass b)
{
return a.num-b.num;
}

int
main()
{
fun_comp fptr;
fptr = &comp;
set<MyClass, int (*)(MyClass, MyClass)> b(fptr);

for(int i=3; i< 5; i++)
{
printf("started with i: %d....\n\n", i);
{
MyClass m;
m.num=i*1.134;
b.insert(m);
printf("Inserted val: %lf\n", m.num);
}
printf("ended....\n\n");
}

printf("Done with insert..\n");
return 0;
}

输出:从我开始:3....

插入的值:3.402000

为 val: 3.402000 调用了析构函数

结束....

开始于 i: 4....

调用的析构函数..for val: 4.536000 <-------- 为什么在插入之前释放它

调用的析构函数..for val: 3.402000 <-------- 多次调用此值对象的析构函数

为 val: 4.536000 调用了析构函数 <-------- ??

析构函数调用..for val: 3.402000 <------ again!!

插入的值:4.536000

为 val: 4.536000 调用了析构函数

结束....

完成插入..

调用的析构函数..for val: 3.402000

为 val: 4.536000 调用了析构函数

最佳答案

比较器

int    
comp(MyClass a, MyClass b)
{
return a.num-b.num;
}

按值获取其参数。这将创建额外的拷贝,然后将其销毁。

通过引用传递会更好。

关于c++ - 插入期间容器 std::set 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748688/

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