C++ C++;设置唯一性覆盖

C++ C++;设置唯一性覆盖,c++,stl,c++14,C++,Stl,C++14,std::set容器如何检查两个对象是否唯一?我尝试重写相等运算符(=),但没有成功 我想这样做的原因是,我有一个类的人,我指定我的人是同一个人,如果他们有相同的名字(甚至可能是生日、地址等) 在中,他们写了以下内容(我有点不清楚): 标准库在任何地方都使用比较概念,唯一性 通过使用等价关系确定。不确切地说, 如果两个对象a和b都不相同,则认为它们是等效的(不唯一的) 比其他的少:!公司(a、b)和&!薪酬(b,a) 我假设,这个问题也扩展到其他STL容器甚至算法(甚至可能扩展到整个STL)。因

std::set
容器如何检查两个对象是否唯一?我尝试重写相等运算符(=),但没有成功

我想这样做的原因是,我有一个类的人,我指定我的人是同一个人,如果他们有相同的名字(甚至可能是生日、地址等)

在中,他们写了以下内容(我有点不清楚):

标准库在任何地方都使用比较概念,唯一性 通过使用等价关系确定。不确切地说, 如果两个对象a和b都不相同,则认为它们是等效的(不唯一的) 比其他的少:!公司(a、b)和&!薪酬(b,a)

我假设,这个问题也扩展到其他STL容器甚至算法(甚至可能扩展到整个STL)。因此,如果将来我想使用函数
std::find
,我将查找人的名字,而不是对象本身。这是正确的吗


编辑 我想添加一些示例代码

// My operator overloading comparing two strings.
bool operator==(Node & rhs) const {
        return this->name.compare(rhs.name);
}
然后,在UnitTest中,我向集合中添加两次具有相同名称的对象。它被添加了两次(但根据
操作符==
,应该是相同的)

void test_adding_two_identical_nodes() {
    // The pool is a set<Node> inside
    model::Node_Pool pool{};
    pool.store_node(model::Node{"Peter"});
    pool.store_node(model::Node{"Peter"});
    // Should be only 1 because the same node should be added once into a set.
    ASSERT_EQUAL(1, pool.size());
}
void test\u添加两个相同的节点(){
//游泳池在里面
模型::节点_池{};
pool.store_节点(model::node{“Peter”});
pool.store_节点(model::node{“Peter”});
//应仅为1,因为同一节点应添加到集合中一次。
断言_等于(1,pool.size());
}

首先,不要覆盖比较运算符来比较除完全等价之外的任何内容。否则,您将陷入维护噩梦


这就是说,您将覆盖
操作符
std::set
不使用
==
进行比较。默认情况下,它使用
std::less
进行比较。反过来
std::less
默认情况下使用您编写的
操作符“它不工作”;您可以向我们显示一个(最小值)不起作用的代码示例?related/dupe:@max66让我马上添加它。另外,请参阅“Relational Operators”在此页面上:
std::binary_函数
已被弃用,不应再使用。@NathanOliver-
std::binary_函数
已被弃用,因为有新的样式不需要它引入的名称,但在编写旧样式的比较器时使用它并没有错。@Petebeckr我的警告是因为它被标记为C++14。@NathanOliver-non-sequitur。如果我使用函数std::find,这也会起作用吗?它会找到具有相同uid的两个对象吗?@ElMac:No。这需要
操作符==
。但是你不会对集合使用
std::find
。@ElMac我添加了对
std::set::find()的调用
到示例中。@Robᵩ 例如,如果我有一个
人的
共享的ptr
,而我的集合是
集合
,会发生什么?如果
集合
中的人首先嵌套在
共享的ptr
,我的意思是我想做一些类似
我的集合。查找(“字符串”)
struct compare_people : std::binary_function<person,person,bool>
{
    bool operator () ( person const& a, person const& b) const { return a.name() < b.name();
};

std::set<person, compare_people> my_set;
#include <set>
#include <cassert>

struct Person {
    const char *name;
    int uid;
};
bool operator<(const Person& a, const Person& b) {
    return a.uid < b.uid;
}
int main () {
   Person joe = {"joseph", 1};
   Person bob = {"robert", 2};
   Person rob = {"robert", 3};
   Person sue = {"susan", 4};

   std::set<Person> people;
   people.insert(joe);
   people.insert(bob);
   people.insert(rob);

   assert(people.count(joe) == 1);
   assert(people.count(bob) == 1);
   assert(people.count(rob) == 1);
   assert(people.count(sue) == 0);

   Person anonymous_3 = {"", 3};
   assert( std::strcmp(people.find(anonymous_3)->name, "robert") == 0);
}
struct Person_Compare {
    bool operator()(const Person& a, const Person& b) const {
        return a.uid < b.uid;
    }
};
std::set<Person, Person_Compare> people;