如何在单个 SET 中比较结构的两个属性?



我的代码如下。 我有结构ABC,我已经设置了g_ABCSet来比较id。

struct ABC
{
CString name;
byte id[2];
}
typedef shared_ptr<ABC> ABC_PTR;
std::set<ABC_PTR, CompareABC> g_ABCSet;
class ComparePager{
public:
bool operator()(const ABC_PTR& m1, const ABC_PTR& m2) const {
if (m1->id[0] == m2->id[0]){
return m1->id[1] < m2->id[1];
}
return m1->id[0] < m2->id[0];
}
}

我尝试在集合中搜索,如下所示比较id

static ABC_PTR ABCptr(new ABC);
//Assume ABCptr have some valid ID 
auto it = g_ABCSet.find(ABCptr);
if (it == g_ABCSet.end())
{
//not found
}
else
{
//found one
}

在这里的问题是我是否可以使用相同的集合来比较 ABC 结构中的"字符串名称"。

如果是,如何??

如果没有,我是否需要制作相同的新集合,overlaod运算符来比较Cstring并将所有相同的指针也插入到新集合?

不,你不能使用单个 std::set。

原因:因为该集合要求密钥按"严格排序"。该集合很可能使用树结构来存储其项目,并且树按给定的比较器排序。

这也意味着,如果您插入多个具有不同名称和相同 ID 的项目,则只会存储一个项目(因为比较器说它们都是相同的)

您可以使用 std::find_if 搜索Cstring name

CString searchName = "...";
auto it = std::find_if(
g_ABCSet.begin(), 
g_ABCSet.end(), 
[&](const ABC_PTR& ptr) {
return ptr->name == searchName;
});

如果你有一大组g_ABCSet你应该按照你写的去做:用"name"的比较器创建第二个集。

提示:如果您使用std::array<byte, 2> id而不是byte id[2]则比较器可以像

class ComparePager{
public:
bool operator()(const ABC_PTR& m1, const ABC_PTR& m2) const {
return m1->id < m2->id;
}
}

也许你最好用std::map<std::array<byte, 2>, ABC_PTR>和另一个std::map<CString, ABC_PTR>来完成这项工作。这需要更多的内存(主要是因为CString从g_ABCSet复制到地图中),但完全摆脱了自定义比较器,并且您不会意外使用错误的集合(使用错误的比较器)

相关内容

  • 没有找到相关文章

最新更新