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

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 = &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;
   }
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)

按值获取其参数.这将创建额外的副本,然后销毁.

通过引用传递将更好地工作.