STL 设置::查找重新定义的搜索

STL set::find redefined search

本文关键字:定义 搜索 新定义 设置 查找 STL      更新时间:2023-10-16

我的程序基于一组对,即

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。就目前而言,我可以简单地循环浏览所有可用的组 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];

您无需提供自定义比较器,因为operator<已为 std::pair 定义了比较器。

如果你想按部分对象搜索,你最好不要使用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,请使用在 groupID 上比较的函数。

最后,如果您真的不需要将GroupIDinnerPair放在一起,则可以使用map(或multimap),使用GroupIDinnerPair作为Key

如果你想

继续使用std::set那么你可以将std::find_if与自定义谓词一起使用,看看这个答案。

基本上你会定义一个函数

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

这将为您完成工作。