在c ++中重载std :: string小于运算符

时间:2015-03-09 15:56:57

标签: c++ string stl operator-overloading

我想使用map<string, int>来存储字符串的出现。

由于要求,我必须超载&#34;&lt;&#34; std :: string的运算符,与授予的字典顺序的顺序不同。我使用免费功能,如下所示。

bool operator<(const string& a, const string& b) {
    int mini = min (a.length(), b.length());
    for(int i=0; i < mini; ++i){
        if (a[i] < b[i])
        return true;
    }
    if (a.length() <= b.length()) return false;
    return true;
}

然而,它没有被调用。字典顺序被调用。 这是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

不,这不是正确的方法。

您应该定义一个可以进行所需比较的自定义仿函数。用它来创建地图。

struct MyCustomFunctor
{
    bool operator()(const string& a, const string& b) { /* Add the details */ }
};

然后使用以下方法创建地图:

map<string, int, MyCustomFunctor> myMap;

如果您能够使用支持C ++ 11的编译器,那么您可以使用lambda函数来完成工作而不必创建类。

auto lambda = [](const string& a, const string& b) -> bool {return (a < b);};
map<string, int, decltype(lambda)> myMap(lambda);

当您使用map自定义比较功能时,您必须记住对map::begin()map::end()map::find()等的调用会返回一个迭代器, type包括自定义比较功能。使用auto是创建作为map的迭代器的变量的最佳方法。

auto it = myMap.begin();
auto it = myMap.find("some key");