[英]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.