c++ shared_ptr<map<int, int>> 用不同的比较函数初始化,有什么办法吗?
c++ shared_ptr<map<int, int>> initialized with different comparison function, any way?
如果我在 class 中有一个字段,如下所示,
class MyClass {
public:
shared_ptr<map<int, int>> my_map;
}
默认map<int,int>
的比较函数是less<int>
,但是我想初始化my_map
为
my_map = make_shared<map<int, int, greater<int>>>();
有时候,
这无法编译,我还有什么其他方法可以让 shared_ptr<map<int, int>>
在 MyClass
的两个不同对象中,一个有 less<int>
而另一个有 greater<int>
所以每个对象中的 my_map
排序不同?
您可以使用自定义比较器,例如:
struct my_comparator {
bool the_other_way=false;
my_comparator(bool flag) : the_other_way{flag} {}
bool operator()(int a, int b) const
{
return the_other_way ? a > b: a < b;
}
};
并构造一个std::map<int, int, my_comparator>
.
std::map
有一个重载的构造函数,它将比较器对象的实例作为参数。您可以相应地简单地构建每个单独的地图。
typedef std::map<int, int, my_comparator> my_map;
my_map m1{my_comparator{false}};
my_map m2{my_comparator{true}};
如果你想为不同的对象自定义内部 map
不同的比较器,你可以模板化 class 来接受一个比较对象,像这样:
template<typename Compare = std::less<int>>
class MyClass
{
public:
std::shared_ptr<std::map<int, int, Compare>> my_map;
};
然后创建不同的对象:
int main()
{
MyClass<> a; // std::less<int> by default
MyClass<std::greater<int>> b;
}
这是一个demo。
比较器是类型声明的一部分,因此您的成员需要包含比较器类型:
class MyClass {
public:
shared_ptr<map<int, int, greater<int>>> my_map;
}
此外,您在作业中缺少“>”。应该是:
my_map = make_shared<map<int, int, greater<int>>>();
如果您想将 class 模板化以使用不同的比较器(正如问题所暗示的那样),请参阅 cigien 的回答。
what other way I can have a shared_ptr<map<int, int>>
that in two different object of MyClass
, one has less<int>
and the other have greater<int>
so that the my_map
in each object is sorted differently?
您可以将 std::function
指定为比较器的模板参数,如
std::shared_ptr<std::map<int, int, std::function<bool(int,int)>>> my_map;
并用std::less<int>
初始化
my_map = std::make_shared<std::map<int, int, std::function<bool(int,int)>>>(std::less<int>{});
或std::greater<int>
.
my_map = std::make_shared<std::map<int, int, std::function<bool(int,int)>>>(std::greater<int>{});
如果我在 class 中有一个字段,如下所示,
class MyClass {
public:
shared_ptr<map<int, int>> my_map;
}
默认map<int,int>
的比较函数是less<int>
,但是我想初始化my_map
为
my_map = make_shared<map<int, int, greater<int>>>();
有时候,
这无法编译,我还有什么其他方法可以让 shared_ptr<map<int, int>>
在 MyClass
的两个不同对象中,一个有 less<int>
而另一个有 greater<int>
所以每个对象中的 my_map
排序不同?
您可以使用自定义比较器,例如:
struct my_comparator {
bool the_other_way=false;
my_comparator(bool flag) : the_other_way{flag} {}
bool operator()(int a, int b) const
{
return the_other_way ? a > b: a < b;
}
};
并构造一个std::map<int, int, my_comparator>
.
std::map
有一个重载的构造函数,它将比较器对象的实例作为参数。您可以相应地简单地构建每个单独的地图。
typedef std::map<int, int, my_comparator> my_map;
my_map m1{my_comparator{false}};
my_map m2{my_comparator{true}};
如果你想为不同的对象自定义内部 map
不同的比较器,你可以模板化 class 来接受一个比较对象,像这样:
template<typename Compare = std::less<int>>
class MyClass
{
public:
std::shared_ptr<std::map<int, int, Compare>> my_map;
};
然后创建不同的对象:
int main()
{
MyClass<> a; // std::less<int> by default
MyClass<std::greater<int>> b;
}
这是一个demo。
比较器是类型声明的一部分,因此您的成员需要包含比较器类型:
class MyClass {
public:
shared_ptr<map<int, int, greater<int>>> my_map;
}
此外,您在作业中缺少“>”。应该是:
my_map = make_shared<map<int, int, greater<int>>>();
如果您想将 class 模板化以使用不同的比较器(正如问题所暗示的那样),请参阅 cigien 的回答。
what other way I can have a
shared_ptr<map<int, int>>
that in two different object ofMyClass
, one hasless<int>
and the other havegreater<int>
so that themy_map
in each object is sorted differently?
您可以将 std::function
指定为比较器的模板参数,如
std::shared_ptr<std::map<int, int, std::function<bool(int,int)>>> my_map;
并用std::less<int>
my_map = std::make_shared<std::map<int, int, std::function<bool(int,int)>>>(std::less<int>{});
或std::greater<int>
.
my_map = std::make_shared<std::map<int, int, std::function<bool(int,int)>>>(std::greater<int>{});