gpt4 book ai didi

c++ - 我如何比较单个 SET 中结构的两个属性?

转载 作者:行者123 更新时间:2023-11-28 04:42:43 26 4
gpt4 key购买 nike

我的代码如下。我有 struct 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 结构中的“Cstring 名称”。

如果是,怎么办??

如果不是,我是否需要制作相同的新集合,覆盖运算符来比较 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 中有大量项目,您应该按照您写的那样做:创建第二个带有“名称”比较器的集合。

提示:如果您使用 std::array<byte, 2> id而不是 byte id[2]你的 Comparator 可以简单到

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 复制到映射中)但完全摆脱了自定义比较器,并且您不会意外使用错误的集合(使用错误的比较器)

关于c++ - 我如何比较单个 SET 中结构的两个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com