raj*_*aja 4 c++ stl insert set
插入集合时,集合内部是否多次删除了一些对象?我尝试插入两个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 = ∁
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;
}
Run Code Online (Sandbox Code Playgroud)
输出: 以i:3开头....
插入val:3.402000
析构函数名为.for val:3.402000
截至....
从i开始:4 ....
析构函数名为.for val:4.536000 <-------为什么在插入之前将其解除分配
destructor called..for val:3.402000 <-------为这个有价值的对象多次调用析构函数
析构函数名为.for val:4.536000 <-------- ??
析构函数被称为... for val:3.402000 <------再次!!
插入val:4.536000
析构函数名为.for val:4.536000
截至....
完成插入..
析构函数名为.for val:3.402000
析构函数名为.for val:4.536000
And*_*ein 11
将比较函数更改为使用(const)引用
int comp(const MyClass& a, const MyClass& b)
{
return a.num-b.num;
}
Run Code Online (Sandbox Code Playgroud)
每次调用comp时,都会创建a和b的副本.在退出时,这些副本正在被销毁.
Bo *_*son 11
比较器
int
comp(MyClass a, MyClass b)
{
return a.num-b.num;
}
Run Code Online (Sandbox Code Playgroud)
按值获取其参数.这将创建额外的副本,然后销毁.
通过引用传递将更好地工作.
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |