[英]STL set::find redefined search
我的程序基於一組對,即
typedef std::pair<int,int> innerPair;
typedef std::pair<innerPair,int> setElement;
std::set<setElement> Foo;
innerPair
元素是真正定義setElement的元素,但我需要將一個組ID附加到每個元素,因此后一個setElement
定義。
在程序的其余部分,我需要找到innerPair
而不管它們的組ID,所以我基本上需要一個函數
std::set<setElement>::iterator find(innePair);
無論其組ID如何,都會找到innerPair。 就目前而言,我可以簡單地循環遍歷所有可用的組ID並執行多個find()調用,但這遠遠沒有效率。
是否有一種簡潔的方法來定義執行某種通配符搜索的find( ... )
成員函數,還是需要使用我自己的定義重載它?
如果您有多個具有相同內部對和不同組ID的元素,則可以使用std::multimap<innerPair, int>
。
這允許您使用相同的innerPair
存儲多個元素。
它還簡化了使用lower_bound/upper_bound
或equal_range
。
我看到兩種可能的設計。 一個可能比另一個更適用。
innerPair
可能更適合作為具有3個成員(第一個,第二個和組ID)或std::tuple<int, int, int>
。 組ID是innerPair
對象的一部分嗎? 如果是這樣,那么我建議這是更好的設計。
如果不是(並且說實話,我認為在你的情況下它不是),你應該使用std::map<innerPair,int>
來創建從innerPair
對象到組ID的映射。 然后,您可以輕松地找到一個元素:
std::map<innerPair,int> mapping;
// Fill your map
innerPair key = {1, 2};
auto found_iter = mapping.find(key);
您還可以獲取特定innerPair
的組ID:
int group_id = mapping[key];
您不需要提供自定義比較器,因為已經為std::pair
定義了operator<
。
如果你想通過部分對象進行搜索,最好不要使用std::set<...>
而是使用std::map<...>
:
std::map<std::pair<int, int>, int>
這幾乎是你為std::set<...>
定位的值類型(不同之處在於第first
成員被聲明為const
)。
如果你真的堅持使用std::set<...>
你需要創建一個忽略最后一個second
成員的比較器類型。 我不確定std::set<...>
支持混合類型比較(我認為它不支持)。
您可以使用multiset
,自定義比較函數或仿函數:
struct innerPairCompare
{
bool operator () (const setElement &a, const setElement &b)
{
const innerPair &a_ = a.first;
const innerPair &b_ = b.first;
return (a_.first > b_.first || a_.first = b_.first && a_.second > b_.second);
}
};
然后將它用於你的multiset
:
std::multiset<setElement,innerPairCompare> Foo;
它將在同一列表中存儲具有相同innerPair
所有setElement
。
或者,如果您需要具有給定GroupID
所有innerPair
,請使用innerPair
上的函數比較。
最后,如果您不需要將GroupID
和innerPair
保持在一起,則可以使用GroupID
或innerPair
作為Key
使用map
(或multimap
)。
如果你想繼續使用std::set
你可以使用std::find_if
和自定義謂詞,看一下這個答案 。
基本上你會定義一個函數
bool pairCorresponds(std::pair<int,int> element)
這將為你工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.