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

标签 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;
   }

输出: 从我开始: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/

相关文章:

c++ - 我可以在不指定所有模板参数的情况下使用 std::set 构造函数指定比较器吗

mysql - 如何使用INSERT中的SELECT来定义mysql中的特定列

C++ else 语句仅当宏被定义时

c++ - 无法通过move_pages()查询

c++ - 如何在 C++ 中将字符串传递给 const char*?

php - 解析 mysql 错误消息 - 这是正确的方法吗?

SQL Server,无法在主键字段中插入空值?

c++ - 类对象的自毁

c++ - 如何在 Linux 中的 GDB/Nemiver 中显示 C++ STL 容器

C++ - 如何判断 map 中的 map 中是否存在某个键