Я просто прочитал несколько рекомендаций по использованию
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
вместо
if( s == t )
{
Я почти всегда использую последний, потому что привык к нему, и он кажется естественным, более читабельным. Я даже не знал, что была отдельная функция сравнения. Чтобы быть более точным, я думал, что == вызовет Compare ().
В чем различия? В каком контексте один путь следует отдавать предпочтение другому?
Я рассматриваю только те случаи, когда мне нужно знать, совпадает ли строка с другой строкой.
if(x.compare(y) == 0)
<- знак равенства, он равен. Использование IMO!
служит только для того, чтобы сделать код нечитаемым.compare
возврат,-1
еслиs
меньше, чем,t
и+1
еслиs
больше, чемt
во время==
возвратаtrue/false
. Ненулевые целые числа естьtrue
и0
естьfalse
.Ответы:
Это то, что стандарт должен сказать о
operator==
Похоже, нет большой разницы!
источник
!s.compare(t)
иs == t
вернет то же значение, но функция сравнения предоставляет больше информации, чемs == t
, иs == t
более читабельна, когда вам все равно, как отличаются строки, но только если они отличаются.std :: string :: compare () возвращает
int
:s
иt
равны,s
меньше чемt
,s
больше чемt
.Если вы хотите, чтобы ваш первый фрагмент кода был эквивалентен второму, он должен выглядеть так:
Оператор равенства проверяет только равенство (отсюда и его имя) и возвращает
bool
.Разобраться в вариантах использования
compare()
может быть полезно, если вас интересует, как две строки связаны друг с другом (меньше или больше), когда они разные. PlasmaHH справедливо упоминает деревья, и это может быть, скажем, алгоритм вставки строк, который стремится сохранить сортировку контейнера, алгоритм дихотомического поиска для вышеупомянутого контейнера и так далее.РЕДАКТИРОВАТЬ: Как отмечает Стив Джессоп в комментариях,
compare()
наиболее полезно для быстрой сортировки и алгоритмов двоичного поиска. Естественные сортировки и дихотомический поиск могут быть реализованы только с помощью std :: less .источник
std::less
, который также является полным порядком в данном случае), а не трехсторонний компаратор ,compare()
для операций, смоделированных наstd::qsort
иstd::bsearch
, в отличие от тех, на которых смоделированыstd:sort
иstd::lower_bound
.compare
имеет перегрузки для сравнения подстрок. Если вы сравниваете целые строки, вы должны просто использовать==
оператор (и неважно, вызывает он этоcompare
или нет).источник
Внутренне
string::operator==()
используетstring::compare()
. Пожалуйста, обратитесь к: CPlusPlus -string::operator==()
Я написал небольшое приложение для сравнения производительности, и, очевидно, если вы компилируете и запускаете свой код в среде отладки,
string::compare()
это немного быстрее, чемstring::operator==()
. Однако, если вы компилируете и запускаете свой код в среде Release, оба они в значительной степени одинаковы.К вашему сведению, я провел 1 000 000 итераций, чтобы прийти к такому выводу.
Для того чтобы доказать, почему в среде отладки строка :: сравнивается быстрее, я пошел в сборку и вот код:
DEBUG BUILD
строка :: оператор == ()
строка :: сравнить ()
Вы можете видеть, что в string :: operator == () он должен выполнять дополнительные операции (добавить esp, 8 и movzx edx, al)
РЕЛИЗ СТРОЙ
строка :: оператор == ()
строка :: сравнить ()
Оба ассемблерных кода очень похожи, так как компилятор выполняет оптимизацию.
Наконец, по моему мнению, прирост производительности незначителен, поэтому я бы действительно оставил разработчику право решать, какой из них предпочтительнее, поскольку оба достигают одного и того же результата (особенно когда это сборка релиза).
источник
compare()
эквивалентно strcmp ().==
простая проверка на равенствоcompare()
поэтому возвращаетint
,==
является логическим.источник
compare()
вернетсяfalse
(ну,0
), если строки равны.Так что не смей обменивать одно на другое.
Используйте то, что делает код более читабельным.
источник
Если вы просто хотите проверить равенство строк, используйте оператор ==. Определить, равны ли две строки, проще, чем найти порядок (который дает сравнение (), так что он может в вашем случае быть лучше использовать оператор равенства.
Более длинный ответ: API предоставляет метод проверки на равенство строк и метод проверки порядка строк. Вам нужно равенство строк, поэтому используйте оператор равенства (чтобы ваши ожидания и ожидания разработчиков библиотек совпали.) Если производительность важна, вы можете протестировать оба метода и найти самый быстрый.
источник
Предположим, рассмотрим две строки s и t.
Дайте им некоторые значения.
Когда вы сравниваете их, используя (s == t), он возвращает логическое значение (true или false, 1 или 0).
Но когда вы сравниваете, используя s.compare (t) , выражение возвращает значение
(i) 0 - если s и t равны
(ii) <0 - либо если значение первого несопоставленного символа в s меньше, чем значение t или длина s меньше, чем у t.
(iii) > 0 - либо если значение первого несопоставленного символа в t меньше значения s, либо длина t меньше значения s.
источник
Одна вещь, которая здесь не рассматривается, это то, что это зависит от того, сравниваем ли мы строку со строкой c, c строкой со строкой или строкой со строкой.
Основное отличие состоит в том, что для сравнения двух строк проверяется равенство размеров перед выполнением сравнения, и это делает оператор == быстрее, чем сравнение.
вот сравнение, как я вижу это на g ++ Debian 7
источник