2

我的程序基于一组对,即

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( ... )执行某种通配符搜索的成员函数,还是我需要用自己的定义重载它?

4

5 回答 5

3

如果您有多个元素具有相同的内部对和不同的组 id,则可以使用std::multimap<innerPair, int>.

这允许您使用相同的innerPair.

它还简化了使用lower_bound/upper_boundor的搜索equal_range

于 2012-11-25T22:05:57.807 回答
2

我看到了两种可能的设计。一个可能比另一个更适用。

可能更适合innerPair成为具有 3 个成员(第一个、第二个和组 ID)的结构或一个std::tuple<int, int, int>. 组 ID 是innerPair对象的一部分吗?如果是这样,那么我建议这是更好的设计。

如果不是(老实说,我认为在您的情况下不是),您应该使用 anstd::map<innerPair,int>创建从innerPair对象到组 ID 的映射。然后,您可以通过以下方式轻松找到一个元素:

std::map<innerPair,int> mapping;
// Fill your map
innerPair key = {1, 2};
auto found_iter = mapping.find(key);

您还可以通过以下方式获取特定的组 ID innerPair

int group_id = mapping[key];

您不需要提供自定义比较器,因为operator<已经为std::pair.

于 2012-11-25T21:58:45.767 回答
2

如果要按部分对象搜索,最好不要使用 astd::set<...>而是使用 a std::map<...>

std::map<std::pair<int, int>, int>

无论如何,这几乎具有您针对您的目标的值类型std::set<...>(不同之处在于该first成员被声明为const)。

如果您真的坚持使用 astd::set<...>您需要创建一个忽略最后一个second成员的比较器类型。我不确定是否std::set<...>支持混合类型比较(我认为不支持)。

于 2012-11-25T21:59:15.780 回答
1

您可以使用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;

它将所有相同的setElements存储innerPair在同一个列表中。

或者,如果您需要所有innerPair给定的GroupID,请使用比较 groupID 的函数。

最后,如果您真的不需要将GroupIDand theinnerPair放在一起,您可以使用 a map(or multimap),将 the GroupIDor theinnerPair用作Key.

于 2012-11-25T22:16:02.050 回答
0

如果您想继续使用std::setthen 您可以使用std::find_if自定义谓词,请查看此答案

基本上你会定义一个函数

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

这将为您完成工作。

于 2012-11-25T21:57:50.130 回答