除了汉明距离“00000”之外,我正在比较两个字符串。
std::vector<std::string> vecWeaponsRequired;
struct sHammingDistInfo {
int iHammingDistance;
int iIndexToWeaponsVector;
};
bool bWeaponStringComparision(std::string strLevel1Weapon, std::string strLevel2Weapon) {
bool bFirstLevelStringLessThanSecond = false;
for (unsigned int iIdx = 0; iIdx < strLevel1Weapon.length(); iIdx++) {
if(strLevel1Weapon[iIdx] == strLevel2Weapon[iIdx]) {
continue;
}
else {
if(strLevel1Weapon[iIdx] < strLevel2Weapon[iIdx]) {
bFirstLevelStringLessThanSecond = true;
break;
}
}
}
return bFirstLevelStringLessThanSecond;
}
bool hammingDistLessThanOperator (sHammingDistInfo& lhs, sHammingDistInfo& rhs) {
bool isLess = bWeaponStringComparision(vecWeaponsRequired[lhs.iIndexToWeaponsVector], vecWeaponsRequired[rhs.iIndexToWeaponsVector]);
int iFirstStringLess = 0;
int iSecondStringLess = 0;
if(isLess) {
iFirstStringLess = 0;
iSecondStringLess = 1;
}
else {
iFirstStringLess = 1;
iSecondStringLess = 0;
}
return std::tie(lhs.iHammingDistance, iFirstStringLess) < std::tie(rhs.iHammingDistance, iSecondStringLess);
}
// sort vector of hamming distance according to hamming distance.
std::sort(vecOfHammingDistance.begin(), vecOfHammingDistance.end(), hammingDistLessThanOperator);
当我在代码上面运行以下字符串时
11100
00111
01110
对于以上所有字符串,hamiltion距离为3,因此我希望将数据排序为
00111
01110
11100
我正在获得调试断言,我理解比较器函数不是严格的弱序。任何人都可以找出我的比较器函数中定义为bWeaponStringComparision
的错误是什么吗?
答案 0 :(得分:3)
没有给你一个解决方案,回答问题“任何人都可以弄清楚我的比较器功能中的错误是什么”:
就目前而言,对于前两项,你得到的第一项少于第二项,第二项少于第一项
hammingDistLessThanOperator(vecOfHammingDistance[0], vecOfHammingDistance[1])
hammingDistLessThanOperator(vecOfHammingDistance[1], vecOfHammingDistance[0])
两者都是真的。
你不能让一个小于操作员告诉你x&lt; y和y&lt; x,如果你想要严格的弱排序。
这就是问题所在。
事实上,您需要three properties:
(并且严格地说,无可比拟的项目也具有传递性)。 您的代码打破了不对称性(至少)。 值得为每个人添加一个小测试用例来清除这些内容。
答案 1 :(得分:0)
&#34;展开&#34; tie
并删除额外的变量
return isLess
? lhs.iHammingDistance <= rhs.iHammingDistance
: lhs.iHammingDistance < rhs.iHammingDistance;
如果你给它相同的字符串,结果取决于你的参数的顺序,它会更清楚一点。