当我使用容器std :: set时,我想比较set的Compare.One定义,如下所示:
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;
我们知道比较是集合中元素的排序,它可以是STL中的函数对象,也可以是用户提供它。只有一个函数对象请求是实现opeartor()。在程序中我可以得到比较使用公共成员函数value_compare value_comp() const
我的问题是如何区分两组的排序(两组是否使用相同的排序)?
答案 0 :(得分:2)
std::set
的key_compare
类型设置为Compare
,因此只需:
std::is_same<decltype(set_a)::key_compare, decltype(set_b)::key_compare>::value
或struct
:
template<typename Set1, typename Set2>
struct is_same_comparator: public std::is_same<typename Set1::key_compare,
typename Set2::key_compare> { };
using S1 = std::set<int>;
using S2 = std::set<int, std::greater<int>>;
static_assert(is_same_comparator<S1, S1>{}, "Oops!");
static_assert(is_same_comparator<S1, S2>{}, "Oops!");
答案 1 :(得分:1)
#include <type_traits>
#include <set>
#include <iostream>
template<typename t> class comparator_type;
template<typename v1, typename c1, typename a1>
class comparator_type<std::set<v1, c1, a1>> {
public:
typedef c1 type_t;
};
template<typename set1, typename set2>
constexpr bool is_same_comparators()
{
return std::is_same<typename comparator_type<set1>::type_t,
typename comparator_type<set2>::type_t>
::value;
}
int main()
{
std::set<int> a, b;
std::set<int, std::greater<int>> c;
std::cout << is_same_comparators<decltype(a), decltype(b)>() << std::endl;
std::cout << is_same_comparators<decltype(a), decltype(c)>() << std::endl;
}
结果输出:
1
0
答案 2 :(得分:0)
直接获取key_comp
的std :: set比较,然后将它们与std::is_same
进行比较
#include <set>
#include <iostream>
#include <type_traits>
#include <functional>
int main( )
{
std::set<int> a;
std::set<int, std::greater<int> > b;
std::set<int, std::less<int> > c;
std::cout << std::is_same< decltype(a.key_comp()), decltype(b.key_comp()) >::value << std::endl;
std::cout << std::is_same< decltype(a.key_comp()), decltype(c.key_comp()) >::value << std::endl;
return 0;
}
答案 3 :(得分:0)
你可以判断两个比较函数是否是同一类型(如其他答案所示),但这并不意味着它们是相同的函数。以下代码编译没有错误,即使它们使用不同的排序标准。
#include <set>
#include <functional>
#include <iostream>
bool g(int a, int b) { return a > b; }
bool l(int a, int b) { return a < b; }
int main () {
static_assert(std::is_same<decltype(g), decltype(l)>::value, "" );
{
typedef std::set<int, bool(*)(int, int)> Set1;
Set1 sg(g);
Set1 sl(l);
static_assert(std::is_same<decltype(sg.key_comp()), decltype(sl.key_comp())>::value, "" );
sg.insert({1,2,3});
for (int i : sg) std::cout << i << " "; std::cout << "\n";
sl.insert({1,2,3});
for (int i : sl) std::cout << i << " "; std::cout << "\n";
}
{
typedef std::function<bool(int, int)> Comp;
Comp fg(g);
Comp fl(l);
static_assert(std::is_same<decltype(fg), decltype(fl)>::value, "" );
typedef std::set<int, Comp> Set2;
Set2 sg(fg);
Set2 sl(fl);
static_assert(std::is_same<decltype(sg.key_comp()), decltype(sl.key_comp())>::value, "" );
}
}
并打印:
3 2 1
1 2 3