Как написать собственный лексикографический компаратор c ++ - PullRequest
1 голос
/ 04 сентября 2011

Лексикографическое средство сравнения

если у нас есть строки «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));
}

Теперь я пытаюсь ввести два дополнительных символа, не принадлежащих алфавиту, например «%» и «&», так что при сортировке строк (набор алфавитов) «%» следует рассматривать как меньший, чем все алфавиты, а «&» следует рассматривать как больший, чем все алфавиты,

если у меня есть

«apple%» и «apple &», затем apple% следует считать меньшим, чем apple &

Может кто-нибудь подсказать мне, как написать это на с ++. спасибо

1 Ответ

8 голосов
/ 04 сентября 2011

В заголовке <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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...