如何为地图提供需要静态数据的比较器?

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}
};