我知道一旦声明你就无法改变地图的顺序.相反,我在一个结构中尝试这个:
struct MyStruct
{
std::map<int, double>* my_map;
MyStruct(bool dir)
{
if(dir)
{
my_map = new std::map<int, double, std::less<int> >;
}
else
{
my_map = new std::map<int, double, std::greater<int> >;
}
}
}
这不起作用,并抱怨我在其他条件下更改类型.有没有解决的办法?我能想到的唯一方法是编写自己的比较器并创建一个封装bool dir的对象,这似乎是多余的.
解决方法:
std :: map将比较对象作为模板参数,因此要执行您想要的类型,您可以在运行时更改行为.
struct MoreOrLess
{
bool useLess;
template <class T, class U>
bool operator()(const T &t, const U &u) const
{
if(useLess) return t < u;
else return t > u;
}
};
struct MyStruct
{
std::map<int, double, MoreOrLess> my_map;
MyStruct(bool dir) :my_map(MoreOrLess{dir}) {}
};
这样,无论使用std :: less还是std :: greater,比较仿函数都具有相同的类型(用于std :: map).