【问题标题】:Map operator < conditions - invalid comparator映射运算符 < 条件 - 无效的比较器
【发布时间】:2016-01-06 16:48:21
【问题描述】:

在插入地图时,我需要检查两个子字符串是否相等。代码如下:

class substring {
public:

    substring(string* str, int offset, int length) : str(str), offset(offset), length(length) {  }


    bool operator < (const substring& val) const {

        if (str->compare(offset, length, *val.str, val.offset, val.length) == 0) return false;
        else return true;
    }

    int offset, length;
    string* str;

};

上面的这个类是我地图中的“关键”。 两个子字符串的长度总是相同的。有些条件是错误的,因为它仍然在喊“无效的比较器”。

【问题讨论】:

    标签: c++ string stl operator-overloading


    【解决方案1】:

    比较函数代码中的 if 语句是一种复杂的说法:

    return str->compare(offset, length, *val.str, val.offset, val.length) != 0;
    

    这对于std::map 需要的比较函数是不正确的。请记住,您正在实施小于运算符,而不是等价。如果您希望您的子字符串按升序排序,请使用:

    return str->compare(offset, length, *val.str, val.offset, val.length) < 0;
    

    我建议在 substring 类中使用对 std::string 的 const 引用 - 这将反映您不接受 nullptr 作为指针的事实,并表明您不想通过此类更改原始字符串的意图,并且让你的代码更干净。

    【讨论】:

    • 您的建议也会使课程不可分配。
    • @BenjaminLindley 同意,但如果它的预期用途只是作为地图的键,那么它应该没问题。或者至少 ctor 参数应该是一个 ref,实现可以是一个指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2013-04-28
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2011-08-12
    • 2010-09-13
    相关资源
    最近更新 更多