我想定义一个集合的向量,并定义集合的比较函数。
我知道如何定义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)的事情,但是当我定义一个像上面那样包含这个集合的向量时,我怎么能这样做呢?
答案 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 });
}