我可以延长的std ::地图:: LOWER_BOUND对非key_type的参数搜索?(Can I

2019-10-29 02:02发布

这里是我的情况的说明。 我有一个std::map和我想找到所述第一pair<key,value>其中键是一个等价类键中的任何成员。

#include <map>

struct Category
{
    int foo;
    int bar;

    bool operator < (const Category & rhs) const;    
    bool operator > (const Category & rhs) const;
};

struct Key
{
    Category category;
    float quality;

    bool operator < (const Key & rhs) const
    {
        if (category < rhs.category)
            return true;
        else if (category > rhs.category)
            return false;
        else
            return quality < rhs.quality;
    }
};

struct Value {};

typedef std::map <Key, Value> Container;

Container::iterator find_low_quality
(
    Container & container,
    const Category & category
)
{
    return container.lower_bound (category);
}

Container::iterator find_high_quality
(
    Container & container,
    const Category & category
)
{
    // some checks need to be done, here omitted for brevity
    return --container.upper_bound (category);
}

这不起作用,因为map::lower_boundmap::upper_bound只需要key_type (即Key )的说法。 我无法得到std::lower_bound编译,我看到它需要一个LegacyForwardIterator ,但我有一个很难解释这个规范。

只要该Key为地图是有序的,在Key有一个兼容的排序Category ,即: k<c当且仅当k.category<c所以我的要求似乎逻辑意义。

在实际情况中, Key类的,更复杂,分离质量/组件类(以使用map<category,map<quality,value>>解决方案)是不是真的去工作,如果那是什么你在想的。

我如何才能找到我的地图,它的键等同于一些非关键价值元素的范围的下限(和上)边界?

Answer 1:

C ++ 14引入了一个透明的比较,在有可能的概念来使用findlower_boundupper_bound ,......有什么可以比较的主要类型,只要在比较此行为明确选择。

在你的情况下,你需要添加一个自定义的比较

struct KeyComparator {
    // opt into being transparent comparator
    using is_transparent = void;

    bool operator()(Key const& lhs, Key const& rhs) const {
        return lhs < rhs;
    }

    bool operator()(Key const& lhs, Category const& rhs) const {
      return lhs.category < rhs;
    }

    bool operator()(Category const& lhs, Key const& rhs) const {
      return lhs < rhs.category;
    }
};

然后您需要使用您的Container

typedef std::map <Key, Value, KeyComparator> Container;

现场演示



文章来源: Can I extend std::map::lower_bound to search on non-key_type arguments?