如何为地图提供需要静态数据的比较器?
How to provide map with a comparator that requires static data?
我正在尝试提供一个带有需要静态数据的比较器的地图。但是,以下方法失败了,因为(我的编译器告诉我)C++ 不接受静态构造函数:
struct MyOrder {
static std::map<std::string, int> m_specialOrder;
static MyOrder() {
m_specialOrder["First"] = 1;
m_specialOrder["Second"] = 2;
m_specialOrder["Third"] = 3;
}
bool operator() (const std::string& a, const std::string& b)
{
std::map<std::string, int>::iterator x = m_specialOrder.find(a);
if(x == m_specialOrder.end()) return false;
std::map<std::string, int>::iterator y = m_specialOrder.find(b);
if(y == m_specialOrder.end() || x->second < y->second) return true;
return false;
}
};
我想要静态构造之类的东西,因为我只需要 m_specialOrder 映射的一个实例,并且我不希望每次使用比较器或定义使用它的映射时都初始化它。
我的目标是能够在地图上使用我的特殊订单,例如:
std::map<std::string, double, MyOrder> mySpecialMap;
我怎样才能做到这一点?
你不能有一个 static
构造函数——这没有意义,只需使用:
MyOrder() {
m_specialOrder["First"] = 1;
m_specialOrder["Second"] = 2;
m_specialOrder["Third"] = 3;
}
在 C++98 中你可以这样做:
将其放入您的头文件中:
static std::map<std::string, int> m_specialOrder;
static std::map<std::string, int> initSpecialOrder();
将其放入您的 cpp 文件中:
std::map<std::string, int> MyOrder::m_specialOrder =
MyOrder::initSpecialOrder();
std::map<std::string, int> MyOrder::initSpecialOrder() {
std::map<std::string, int> res;
res["First"] = 1;
res["Second"] = 2;
res["Third"] = 3;
return res;
}
在 C++11 及更高版本中,您可以删除 initiSpecialOrder
,并改用花括号初始化程序:
std::map<std::string, int> MyOrder::m_specialOrder = {
{"First", 1}, {"Second", 2}, {"Third", 3}
};
我正在尝试提供一个带有需要静态数据的比较器的地图。但是,以下方法失败了,因为(我的编译器告诉我)C++ 不接受静态构造函数:
struct MyOrder {
static std::map<std::string, int> m_specialOrder;
static MyOrder() {
m_specialOrder["First"] = 1;
m_specialOrder["Second"] = 2;
m_specialOrder["Third"] = 3;
}
bool operator() (const std::string& a, const std::string& b)
{
std::map<std::string, int>::iterator x = m_specialOrder.find(a);
if(x == m_specialOrder.end()) return false;
std::map<std::string, int>::iterator y = m_specialOrder.find(b);
if(y == m_specialOrder.end() || x->second < y->second) return true;
return false;
}
};
我想要静态构造之类的东西,因为我只需要 m_specialOrder 映射的一个实例,并且我不希望每次使用比较器或定义使用它的映射时都初始化它。
我的目标是能够在地图上使用我的特殊订单,例如:
std::map<std::string, double, MyOrder> mySpecialMap;
我怎样才能做到这一点?
你不能有一个 static
构造函数——这没有意义,只需使用:
MyOrder() {
m_specialOrder["First"] = 1;
m_specialOrder["Second"] = 2;
m_specialOrder["Third"] = 3;
}
在 C++98 中你可以这样做:
将其放入您的头文件中:
static std::map<std::string, int> m_specialOrder;
static std::map<std::string, int> initSpecialOrder();
将其放入您的 cpp 文件中:
std::map<std::string, int> MyOrder::m_specialOrder =
MyOrder::initSpecialOrder();
std::map<std::string, int> MyOrder::initSpecialOrder() {
std::map<std::string, int> res;
res["First"] = 1;
res["Second"] = 2;
res["Third"] = 3;
return res;
}
在 C++11 及更高版本中,您可以删除 initiSpecialOrder
,并改用花括号初始化程序:
std::map<std::string, int> MyOrder::m_specialOrder = {
{"First", 1}, {"Second", 2}, {"Third", 3}
};