如何编写自定义词典比较器c ++

时间:2011-09-04 19:02:03

标签: c++ algorithm data-structures

词典比较意味着

如果我们有字符串“cat”“apple”“dog”“算法”之后,它们按字典顺序相互比较,它们按字典顺序排列 喜欢以下

  算法,苹果,猫,狗

我已经编写了以下比较器,用于按字典顺序对这些字符串进行排序。

inline bool leq(int a1, int a2, int b1, int b2)
{
    return (a1 < b1 || a1 == b1 && a2 <= b2);
}

inline bool leq(int a1, int a2, int a3, int b1, int b2, int b3)
{
    return(a1 < b1 || a1 == b1 && leq(a2, a3, b2, b3));
}

现在我试图引入另外两个不属于字母集的符号 “%”和“&amp;”这样当排序字符串(字母表集)时,“%”应被视为小于所有字母和“&amp;”应被视为比所有

字母更大

如果我有

“apple%”和“apple&amp;”那么apple%应该被认为小于apple&amp;

有人可以建议我如何用c ++编写这个。谢谢

1 个答案:

答案 0 :(得分:8)

<algorithm>标题中有一个算法执行词典比较,恰当地命名为lexicographical_compare。有什么好处是你可以提供自己的比较功能,可以考虑你的特殊字符:

#include <algorithm>
#include <string>

bool SpecialCharCompare(char lhs, char rhs) {
    // I'll leave the implementation of the '%', '&' special casing to you.
    // One way to do it would be to check if lhs/rhs are '%' or '&', in
    // which case, you can assign them to some other char value such as
    // ('a' - 1) or ('z' + 1).
}

int main(int argc, char** argv) {
    std::string s1("apple%");
    std::string s2("apple&");

    bool result = std::lexicographical_compare(
        s1.begin(), s1.end(),
        s2.begin(), s2.end(),
        SpecialCharCompare
    );

    if (result) {
        // s1 is less than s2
    } else {
        // s1 is NOT less than s2
    }

    return 0;
}