как улучшить мою функцию сравнения объектов "String" - PullRequest
0 голосов
/ 25 июня 2018

Мне кажется, что мой function неоправданно длинный, но я не могу понять, как уменьшить длину без добавления библиотек (не разрешается добавлять дополнительные библиотеки). Я создаю класс String, который должен вести себя как c ++ string. Я также включил constructors, чтобы сделать мой код более понятным. Я пытался использовать while (true) loop, но когда я его создал, он был почти такой же длины, как этот.

String::String() :len(0), str(nullptr)
{}

String::String(const char arr[])
{
    len = get_cstr_length(arr);
    str = new char[len];
    for (int j = 0; j < len; j++)
    {
        str[j] = arr[j];
    }
}

int compare_strings(const String &obj1, const String &obj2)
{
    int count = 0;
    int len1 = obj1.length();
    int len2 = obj2.length();

    if (len1 != 0 && len2 != 0)
    {
        if (len1 < len2)
        {
            for (int i = 0; i < len1; i++)
            {
                if (obj1[i] > obj2[i])
                    return 1;
                else if (obj1[i] < obj2[i])
                    return -1;
                else
                    count++;
            }
            if (count == len1)
                return -1;
        }
        else
        {
            for (int i = 0; i < len2; i++)
            {
                if (obj1[i] > obj2[i])
                    return 1;
                else if (obj1[i] < obj2[i])
                    return -1;
                else
                    count++;
            }
            if (count == len2 && len1 != len2)
                return 1;
            else
                return 0;
        }
    }
    else
    {
        if (len1 == 0 && len2 == 0)
            return 0;
        else if (len1 == 0 && len2 != 0)
            return -1;
        else
            return 1;
    }
}

1 Ответ

0 голосов
/ 25 июня 2018

Вам не нужно заранее проверять длину:

int compare_strings(const String &obj1, const String &obj2)
{
    int len1 = obj1.length();
    int len2 = obj2.length();

    int prefix = min(len1, len2);

    // compare the strings up to the length of the shorter string
    for (int i = 0; i < prefix; i++)
    {
        if (obj1[i] > obj2[i])
            return 1;
        else if (obj1[i] < obj2[i])
            return -1;
    }
    // no need for separate count variable, i must equal prefix
    if (len1 < len2)
    {
      return -1;
    }
    if (len2 < len1)
    {
      return 1;
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...