Возвращаемое значение сравнения строк (используется в приложениях, которые сортируют символы?) - PullRequest
1 голос
/ 30 сентября 2011

Когда мы используем strcmp(str1, str2); или str1.compare(str2);, возвращаемые значения равны -1, 0 и 1 для str1 str2 соответственно.

Вопрос в том, определено ли это по определенной причине? Например, в алгоритме сортировки двоичного дерева мы помещаем меньшие значения в левый дочерний элемент и большие значения в правый дочерний. Эти функции strcmp или string :: compare кажутся идеальными для этого. Однако кто-нибудь использует сопоставление строк для сортировки дерева (целочисленный индекс проще в использовании)?

Итак, каково действительное назначение трех возвращаемых значений (-1, 0, 1). Почему он не может просто вернуть 1 для истины и 0 для ложных?

Спасибо

Ответы [ 4 ]

3 голосов
/ 30 сентября 2011

Цель иметь три возвращаемых значения - это именно то, на что это похоже: ответить сразу на все вопросы о сравнении строк.

У всех разные потребности. Некоторые люди иногда нуждаются в простом тесте «меньше»; strncmp обеспечивает это. Некоторые люди нуждаются в тестировании на равенство; strncmp обеспечивает это. Некоторые люди действительно должны знать полную связь между двумя строками; strncmp обеспечивает это.

Что вам абсолютно не нужно, так это кто-то пишет:

if(strless(lhs, rhs))
{
}
else if(strequal(lhs, rhs))
{
}

Это делает две потенциально дорогие операции сравнения. strless также знает, равны ли они, потому что нужно было до конца обеих строк вернуть, чтобы оно было не меньше.

Да, и к вашему сведению: возвращаемые значения не -1 или +1; это больше нуля или меньше нуля. Или ноль, если они равны.

0 голосов
/ 30 сентября 2011

Как уже говорили другие, существуют реальные цели для сравнения строк с <> == значениями. Например; числа фиксированной длины, присвоенные строкам, будут разрешены правильно; т.е.: "312235423"> "312235422". В некоторых случаях это полезно.

Однако запрашиваемая вами функция true / false для решений все еще работает с заданными возвращаемыми значениями.

if (-1)
  {
     // resolves true
  }
else if (1)
  {
     // also resolves true
  }
 else if (0)
  {
    // resolves false
  }
0 голосов
/ 30 сентября 2011

Может, но тогда вам понадобится несколько функций для сортировки и сравнения. С strcmp (), возвращающим меньше, равно или больше, вы можете легко использовать их для сравнения и сортировки.

Помните, что BST не единственное место, где вы хотите сравнить строки. Вы можете отсортировать список имен или подобное. Кроме того, весьма обычно иметь строку в качестве ключа в дереве.

0 голосов
/ 30 сентября 2011

Это полезно для определенных случаев, когда важно знать все три случая.Используйте operator< для string, когда вам нужно только логическое сравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...