Сравнение строк, С++

У меня вопрос:

Скажем, есть два 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 для простоты простое лексикографическое сравнение, основанное на сравнении, нежели сравнение, может быть очень просто реализовано с точки зрения сравнения кортежей.