C++ 标准设置插入不"working"

c++ std set insert not "working"

本文关键字:working 插入 标准 设置 C++      更新时间:2023-10-16

我在std集上遇到了一些问题。我知道它不允许插入重复的元素,而且(我认为(我的代码并没有试图插入重复的元件。但似乎这个集合并没有同时插入这两个元素。问题出在哪里?该系列考虑的两个元素是否相等?为什么?

#include <bits/stdc++.h>
using namespace std;
struct sam{
    double a,b, tam;
    sam(){
    }
    sam(double a1, double b1){
        a = a1;
        b = b1;
        tam = b - a;
    }
    bool operator<(const sam &p) const{
        return tam > p.tam;
    }
};
set<sam> ssw;
int main(void){
    ssw.insert(sam(0,2));
    ssw.insert(sam(4,6));
    cout<<ssw.size()<<"n"; // prints "1"
    return 0;
}

std::set

用不精确的术语来说,两个对象a和b被认为是等价的(而不是唯一(,如果两者的比较都小于另一个:!comp(a,b(&amp;!comp(b,a(

在您的情况下,bool operator<不满足上述条件,因此集合不处理unique

对于这两个对象,tam的值都是2.0。由于operator<函数使用该值,因此这两个对象被认为是相等的。

顺便说一句,使用浮点数来比较两个对象不是一个好主意。由于浮点表示方式的不精确性,您可能会得到意外的结果。

当前比较器为两个插入返回相同的值。因此,只有一个项目被成功插入。另一个只是重复,因此被忽略。

也许你的意思是:

bool operator<(const sam &p) const{
        return ( (a > p.a) || (b > p.b) || (tam > p.tam) );
    }