地图运算符 < 条件 - 无效比较器
Map operator < conditions - invalid comparator
我需要在插入到地图时检查两个子字符串是否相等。这是代码:
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;
};
上面的class是我地图中的'key'。 两个子字符串的长度总是相同的。 某些条件是错误的,导致它还在大喊大叫'invalid comparator'。
你在比较函数代码中的 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
class 中使用对 std::string
的 const 引用 - 这将反映出您不接受 nullptr
作为指针的事实并表明意图您不想通过此 class 更改原始字符串并使您的代码更清晰。
我需要在插入到地图时检查两个子字符串是否相等。这是代码:
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;
};
上面的class是我地图中的'key'。 两个子字符串的长度总是相同的。 某些条件是错误的,导致它还在大喊大叫'invalid comparator'。
你在比较函数代码中的 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
class 中使用对 std::string
的 const 引用 - 这将反映出您不接受 nullptr
作为指针的事实并表明意图您不想通过此 class 更改原始字符串并使您的代码更清晰。