当set是向量

时间:2016-04-01 11:00:27

标签: c++11

我想定义一个集合的向量,并定义集合的比较函数。

我知道如何定义set compare函数,如下所示:

bool isSmall(const std::pair<int, int> &i1, const std::pair<int, int> &i2)
{
    return i1.second < i2.second;
}
std::set<std::pair<int, int>, decltype(isSmall)*> set_int(isSmall);

但是如果我有一个向量,并且向量元素是我自定义的集合呢?

std::vector< std::set<std::pair<int, int>, decltype(isSmall)*> > vec_set

这不是正确的,因为当我插入vec_set [0]时,另一个相同的元素如&lt; 1,1&gt; (&lt; 1,1&gt;已插入vec_set [0])程序然后崩溃。

似乎我也应该做类似set_int(isSmall)的事情,但是当我定义一个像上面那样包含这个集合的向量时,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:0)

您可能不会将isSmall指定为比较器。 (模板参数只指定了它的类型)

using T = std::pair<int, int>;

bool isSmall(T const & i1, T const & i2)
{
    return i1.second < i2.second;
}

void main()
{
    typedef bool(*CompareFunc)(T const &, T const &); // decltype(isSmall)*

    std::vector< std::set<T, CompareFunc> > vec_set;

    vec_set.push_back(std::set<T, CompareFunc>(isSmall)); // <-- assign the function in every set<>-constructor manually
    vec_set[0].insert({ 1,1 });
    vec_set[0].insert({ 1,1 });
}

您也可以使用仿函数代替函数:

struct CompareFunc // : public std::binary_function<T, T, bool>
{
    bool operator()(T const &i1, T const &i2) const
    {
        return i1.second < i2.second;
    }
};

void main()
{
    std::vector< std::set<T, CompareFunc> > vec_set;

    vec_set.resize(1); // <-- comparator gets instantiated automatically
    vec_set[0].insert({ 1,1 });
    vec_set[0].insert({ 1,1 });
}

另请参阅:http://en.cppreference.com/w/cpp/concept/Compare