簡體   English   中英

STL set :: find重新定義的搜索

[英]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_boundequal_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上的函數比較。

最后,如果您不需要將GroupIDinnerPair保持在一起,則可以使用GroupIDinnerPair作為Key使用map (或multimap )。

如果你想繼續使用std::set你可以使用std::find_if和自定義謂詞,看一下這個答案

基本上你會定義一個函數

bool pairCorresponds(std::pair<int,int> element)

這將為你工作。

暫無
暫無

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

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