如何实现set :: find()只匹配一对的键?

时间:2016-06-03 02:22:24

标签: c++ stl set iteration

我有一个容器类,用于在std::set中存储数据。我不需要或使用std::map提供的扩展设施。有一个方法values()const reference返回到私有集,所以如果我要使用地图,那么我将不得不复制整个容器。我希望将其保留为std::set

该集合包含类似于std::pair的类的对象,其中包含键和值,并实现operator <以便在集合中使用。

我在容器中有一个接受&#39;键的方法。该对的一部分用于搜索集合并返回一个完整的对,同时仅匹配该密钥。

我可以按顺序遍历集合,但后来我失去了O(log N)。

另请注意,需要对集合进行排序,这会删除使用unordered_set的选项。

1 个答案:

答案 0 :(得分:1)

目前还不清楚你的operator<究竟在做什么比较,但是它的长与短是std::set,有效搜索该集的唯一方法是使用它定义的比较函数。

根据您的问题,我假设你的设置是

std::set<std::pair<firstType, secondType>, ComparisonClass>

ComparisonClass实现严格的弱排序。或者,您也可以使用:

std::set<PairClass>

PairClassstd::pair的子类,实现operator<,用于严格的弱排序。您的问题所描述的是其中一个或另一个。但无论哪种方式,两种替代方案在逻辑上都是等价的,出于以下答案的目的:

如果您的operator<根据价值对firstsecond实施了严格的弱排序,那么就是这样。您只能通过搜索相同的firstsecond来执行设置的内置对数搜索。

除此之外别无他法。那么,现在呢?

嗯,根本问题似乎是您可能没有使用正确的容器。考虑以下容器,通过一些工作,将等同于您的集合:

std::multimap<firstType, std::set<secondType>>

也就是说,您的容器是由您的对first键入的多地图,其中多地图的价值是配对的所有std::set的{​​{1}}给定secondType

这里唯一需要注意的是以这种方式将插入和删除操作定义到此容器中,这样您永远不会得到firstType的空firstType值。只要满足此条件,这应该在逻辑上等同于std::set的{​​{1}}。此外:

1)您仍然可以通过std::set上的对数搜索,抓取值std::pair来实现对firstType + secondType的算法搜索,以及然后对其执行对数搜索。在逻辑上相当。

2)通过仅执行完整搜索的前半部分,您可以仅对firstType实施算法搜索。这为您提供了值std::set,它提供了具有相同firstType的所有对的等价物。