C ++中使用STL

时间:2018-04-30 10:55:22

标签: c++ stl

除了汉明距离“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的错误是什么吗?

2 个答案:

答案 0 :(得分:3)

没有给你一个解决方案,回答问题“任何人都可以弄清楚我的比较器功能中的错误是什么”:

就目前而言,对于前两项,你得到的第一项少于第二项,第二项少于第一项

hammingDistLessThanOperator(vecOfHammingDistance[0], vecOfHammingDistance[1])
hammingDistLessThanOperator(vecOfHammingDistance[1], vecOfHammingDistance[0])

两者都是真的。

你不能让一个小于操作员告诉你x&lt; y和y&lt; x,如果你想要严格的弱排序。

这就是问题所在。

事实上,您需要three properties

  • 对于S中的所有x,不是x&lt; x(反射性)。
  • 对于S中的所有x,y,如果x <那么y&lt; X (不对称)。
  • 对于S中的所有x,y,z,如果x < y和y&lt; z然后x&lt; ž (传递)。

(并且严格地说,无可比拟的项目也具有传递性)。 您的代码打破了不对称性(至少)。 值得为每个人添加一个小测试用例来清除这些内容。

答案 1 :(得分:0)

&#34;展开&#34; tie并删除额外的变量

return isLess 
     ? lhs.iHammingDistance <= rhs.iHammingDistance 
     : lhs.iHammingDistance < rhs.iHammingDistance;

如果你给它相同的字符串,结果取决于你的参数的顺序,它会更清楚一点。