Сравнение строк, С++
У меня вопрос:
Скажем, есть два std::string
, и я хочу их сравнить, есть возможность использовать функцию compare()
класса string
, но я также заметил, что это возможно с помощью простых операторов < > !=
( оба случая возможны, даже если я не включаю библиотеку <string>
).
Может ли кто-нибудь объяснить, почему существует функция compare()
, если сравнение может быть выполнено с использованием простых операторов?
btw Я использую Code:: Blocks 13.12
вот пример моего кода:
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::getline;
int main()
{
string temp1, temp2;
cout << "Enter first word: ";
getline (cin,temp1);
cout << "Enter second word: ";
getline (cin,temp2);
cout << "First word: " << temp1 << endl << "Second word: " << temp2 << endl;
if (temp1 > temp2)
{
cout << "One" << endl;
}
if (temp1.compare(temp2) < 0)
{
cout << "Two" << endl;
}
return 0;
}
Ответы
Ответ 1
.compare()
возвращает целое число, которое является мерой разности между двумя строками.
- Возвращаемое значение
0
означает, что две строки сравниваются как равные.
- Положительное значение означает, что сравниваемая строка длиннее или первый несогласованный символ больше.
- Отрицательное значение означает, что сравниваемая строка короче или первый несогласованный символ ниже.
operator==
просто возвращает логическое значение, указывающее, равны ли строки или нет.
Если вам не нужны дополнительные детали, вы можете просто использовать ==
.
Ответ 2
string cat = "cat";
string human = "human";
cout << cat.compare(human) << endl;
Этот код даст -1 в результате. Это связано с тем, что первый несовпадающий символ сравниваемой строки "h" меньше или появляется после "c" в алфавитном порядке, даже если сравниваемая строка "человек" длиннее, чем "кошка".
Я считаю, что возвращаемое значение, описанное в cplusplus.com, является более точным, которое are-:
0: они сравнивают равные
<0: Либо значение первого не совпадающего символа меньше в сравниваемой строке, либо совпадают все сравниваемые символы, но сравниваемая строка короче.
больше 0: либо значение первого не совпадающего символа больше в сравниваемой строке, либо совпадают все сравниваемые символы, но сравниваемая строка длиннее.
Более того, описание IMO cppreference.com проще и пока лучше всего описывает мой собственный опыт.
отрицательное значение, если *this
появляется перед последовательностью символов, указанной аргументами, в лексикографическом порядке
ноль, если обе символьные последовательности сравнивают эквивалентно
положительное значение, если *this
появляется после последовательности символов, заданной аргументами, в лексикографическом порядке
Ответ 3
Относительно вопроса,
" может кто-нибудь объяснить, почему существует функция compare()
, если сравнение может быть выполнено с использованием простых операндов?
Относительно <
и ==
функция compare
концептуально проще и на практике она может быть более эффективной, поскольку она позволяет избежать двух сравнений для каждого элемента для обычного упорядочения элементов.
В качестве примера простоты для малых целых значений вы можете написать функцию сравнения, например:
auto compare( int a, int b ) -> int { return a - b; }
который является высокоэффективным.
Теперь для структуры
struct Foo
{
int a;
int b;
int c;
};
auto compare( Foo const& x, Foo const& y )
-> int
{
if( int const r = compare( x.a, y.a ) ) { return r; }
if( int const r = compare( x.b, y.b ) ) { return r; }
return compare( x.c, y.c );
}
Пытаясь выразить это лексикографическое сравнение непосредственно в терминах <
, вы заканчиваете ужасающую сложность и неэффективность, относительно говоря.
С С++ 11 для простоты простое лексикографическое сравнение, основанное на сравнении, нежели сравнение, может быть очень просто реализовано с точки зрения сравнения кортежей.