C++ 如何为map提供需要静态数据的比较器?

C++ 如何为map提供需要静态数据的比较器?,c++,stl,comparator,C++,Stl,Comparator,我试图提供一个带有比较器的地图,它需要静态数据。但是,下面的方法失败了,因为(编译器告诉我)C++不接受静态构造函数: struct MyOrder { static std::map<std::string, int> m_specialOrder; static MyOrder() { m_specialOrder["First"] = 1; m_specialOrder["Second"] = 2; m_speci

我试图提供一个带有比较器的地图,它需要静态数据。但是,下面的方法失败了,因为(编译器告诉我)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;
    }
};
struct MyOrder{
静态std::map m_speciallorder;
静态MyOrder(){
m_SpecialLorder[“第一”]=1;
m_SpecialLorder[“第二”]=2;
m_SpecialLorder[“第三”]=3;
}
布尔运算符()(常数std::string&a,常数std::string&b)
{
std::map::迭代器x=m_speciallorder.find(a);
如果(x==m_speciallorder.end())返回false;
std::map::迭代器y=m_speciallorder.find(b);
如果(y==m|speciallorder.end()|x->secondsecond)返回true;
返回false;
}
};
我想要静态构造之类的东西,因为我只需要一个m_SpecialLorder映射的实例,我不希望每次使用comparator或定义使用它的映射时都初始化它

我的目标是能够在地图上使用我的特殊排序,如:

std::map<std::string, double, MyOrder> mySpecialMap;
std::map mySpecialMap;

我怎样才能做到这一点呢?

你不能有一个
静态的
构造函数——它没有意义,只需使用:

 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();

为什么要将构造函数设置为静态?我希望您没有考虑在映射处于活动状态时更改比较函数中的静态数据。在地图中改变键的顺序会严重破坏地图。正如错误所暗示的,<代码>静态< /代码>构造函数在C++中没有意义。你想在那里做什么?不,我不想更改静态数据。我只是想防止每次使用结构时都重新实例化数据。在问题中添加了一段来澄清这一点。由于
m_SpecialLorder
是静态的,因此运行此代码的频率将超过您应该的频率。或者,您可以在源文件(静态或无名命名空间)中本地定义init函数,等等,因此initSpecialLorder()需要返回std::map,对吗?对initSpecialLorder的调用需要在main()启动之后的某个时间,在使用比较器之前,在执行路径中发生,对吗?@feetwet第一部分为“是”,第二部分为“否”。实际上,
initspeciallorder
需要返回
std::map
,现在已经修复。但是,您不需要在任何地方拨打此电话。C++编译器会为你做这件事,因为它是初始化程序的一部分:代码>代码::MyMyOrth::MySualOrthy= MyOrth::InStimulalOrthOr序()代码>您需要做的就是把它放在任何一个C++文件中。看起来我们要么需要从initspeciallorder调用返回m_speciallorder,要么如果它作为一个void函数工作,那么就声明它是空函数?@feetwet-Oops,这是另一个复制/粘贴错误。我现在修好了。
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;
}
std::map<std::string, int> MyOrder::m_specialOrder = {
    {"First", 1}, {"Second", 2}, {"Third", 3}
};