簡體   English   中英

如何在單個SET中比較struct的兩個屬性?

[英]How can i compare two properties of struct in a single 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結構中的“字符串名稱”嗎?

如果是,怎么辦?

如果沒有,我是否需要創建相同的新集合,覆蓋運算符以比較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復制到映射中),但是完全擺脫了自定義Comparators的影響,並且您不能偶然使用錯誤的set(錯誤的Comparator)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM