【问题标题】:overload std::string less than operator in c++在 C++ 中重载 std::string 小于运算符
【发布时间】:2015-03-09 15:56:56
【问题描述】:

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

由于要求,我必须以与授予的字典顺序不同的顺序重载 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;
}

但是,它不会被调用。字典顺序被调用。 这是正确的方法吗?

【问题讨论】:

  • 这就是为什么订购容器support a custom comparator
  • 您是如何创建地图的?您是否以某种方式告诉它应该使用您的自定义运算符?另外,您确定要在任何地方(在不知不觉中)比较字符串时使用它吗?
  • 是的,这就是我想做的。根据我的订单而不是词典制作地图
  • 请注意,您的运营商违反了严格的总订购要求。具体来说,您同时拥有"a" &lt; "bb""bb" &lt; "a"
  • 嗨,molbdnilo,不,它是严格排序的,“a” "bb"

标签: c++ string stl operator-overloading


【解决方案1】:

不,这不是正确的方法。

您应该定义一个可以进行所需比较的自定义函子。在创建地图时使用它。

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() 等的调用会返回一个迭代器,其类型包括自定义比较函数。使用auto 是创建作为map 的迭代器的变量的最佳方法。

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

【讨论】:

  • 在现代 C++ 中,lambda 函数可能比创建一个全新的类更可取。
  • 这就是为什么即使在 C++11 中使用函数对象作为模板参数仍然更容易
猜你喜欢
  • 2012-01-23
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多