【发布时间】:2020-12-16 17:26:38
【问题描述】:
我正在编写一个包含一些 3d 图形程序结构的集合。我正在尝试做的一件事是找出其中一个结构是否在一组中以使用该知识进行操作。这是一个mwe:
#include <iostream>
#include <set>
class Malla3D
{
public:
int id;
};
struct Objeto
{
Malla3D * modelo;
bool operator < (const Objeto & otro) const;
bool operator == (const Objeto & otro) const;
};
bool Objeto :: operator < (const Objeto & otro) const
{
return this < &otro;
}
bool Objeto :: operator == (const Objeto & otro) const
{
return modelo == otro.modelo;
}
int main ()
{
std::set<Objeto> objetos;
Malla3D * malla1 = new Malla3D({1});
Malla3D * malla2 = new Malla3D({2});
Malla3D * malla3 = new Malla3D({3});
Malla3D * malla4 = new Malla3D({4});
Objeto objeto1({malla1});
Objeto objeto2({malla2});
Objeto objeto3({malla3});
Objeto objeto4({malla4});
objetos.insert(objeto1);
objetos.insert(objeto2);
objetos.insert(objeto3);
objetos.insert(objeto4);
for (auto it = objetos.cbegin(); it != objetos.cend(); ++it)
std::cout << "Item in set: " << (*it).modelo->id << std::endl;
if (objetos.find(objeto1) != objetos.cend())
std::cout << "Found 1." << std::endl;
else
std::cout << "Couldn't find 1." << std::endl;
if (objetos.find(objeto2) != objetos.cend())
std::cout << "Found 2." << std::endl;
else
std::cout << "Couldn't find 2." << std::endl;
if (objetos.find(objeto3) != objetos.cend())
std::cout << "Found 3." << std::endl;
else
std::cout << "Couldn't find 3." << std::endl;
if (objetos.find(objeto4) != objetos.cend())
std::cout << "Found 4." << std::endl;
else
std::cout << "Couldn't find 4." << std::endl;
delete malla1;
delete malla2;
delete malla3;
delete malla4;
}
~
➜ g++ -g -Wall -Wextra -Wpedantic -std=c++17 mwe.cpp
~
➜ ./a.out
Item in set: 1
Item in set: 2
Item in set: 3
Item in set: 4
Couldn't find 1.
Couldn't find 2.
Couldn't find 3.
Couldn't find 4.
因此,基本上,如果两个Objetos 指向相同的内存地址,则它们的modelos 是相同的。这样,我可以从 Malla3D 类中删除 id 成员数据。我已经用 gdb 测试了operator ==,它按预期工作,所以我不明白为什么find 除了end() 之外不能返回。我做错了什么?
【问题讨论】:
-
集合成员的等价性由其排序关系决定——默认为
operator<——而不是==。 -
@molbdnilo 我不明白那是怎么回事。如何知道一个元素是否等于集合中的一个?
-
std::set是有序的,两个元素a和b当且仅当!(a < b) && !(b < a)是等价的——也就是说,如果两者都不在另一个之前。 (等价是比等价更弱的关系。)
标签: c++ iterator set find c++17