C++: string.empty () всегда эквивалентен строке == “”?

Для него есть рубиновый камень - SocialShares

В настоящее время он поддерживает следующие социальные сети:

  • facebook
  • twitter
  • google plus
  • reddit
  • linkedin
  • pinterest
  • stumbleupon
  • vkontakte
  • mail.ru
  • odnoklassniki

Использование:

:000 > url = 'http://www.apple.com/'
  => "http://www.apple.com/"
:000 > SocialShares.facebook url
  => 394927
:000 > SocialShares.google url
  => 28289
:000 > SocialShares.twitter url
  => 1164675
:000 > SocialShares.all url
  => {:vkontakte=>44, :facebook=>399027, :google=>28346, :twitter=>1836, :mail_ru=>37, :odnoklassniki=>1, :reddit=>2361, :linkedin=>nil, :pinterest=>21011, :stumbleupon=>43035}
:000 > SocialShares.selected url, %w(facebook google linkedin)
  => {:facebook=>394927, :google=>28289, :linkedin=>nil}
:000 > SocialShares.total url, %w(facebook google)
  => 423216
:000 > SocialShares.has_any? url, %w(twitter linkedin)
  => true

48
задан A. Rex 27 January 2009 в 13:18
поделиться

7 ответов

Это должно быть. ANSI/ст¦не¦рт ISO указывает в [1 112] 21.3.3 basic_string способность :

size_type size() const;

Возвраты: количество подобных символу объектов в настоящее время в строке.

bool empty() const;

Возвраты: size() == 0

Однако в пункте 18 21.3.1 basic_string конструкторы это указывает, что оператор присваивания типа символов использует traits::length() для установления длины управляемой последовательности, таким образом, Вы могли закончить с чем-то странным при использовании другой специализации std::basic_string<>.

я думаю, что 100%-й корректный оператор то, что

(str.empty() == (str == std::string()))

или что-то как этот. Если Вы не сделали ничего странного, то std::string("") и std::string() должен быть эквивалентен

, Они логически подобны, но они тестируют на разные вещи. str.empty() проверяет, пуста ли строка, где другой проверяет на равенство против пустой строки C-стиля. Я использовал бы, какой бы ни более подходит для того, что Вы пытаетесь сделать. Если Вы хотите знать, пуста ли строка, то используйте str.empty().

11
ответ дан D.Shawley 7 November 2019 в 22:35
поделиться

Ответ

Да. Вот соответствующая реализация от bits/basic_string.h, код для basic_string<_CharT, _Traits, _Alloc>:

  /**
   *  Returns true if the %string is empty.  Equivalent to *this == "".
   */
  bool
  empty() const
  { return this->size() == 0; }

Обсуждение

Даже при том, что две формы эквивалентны для std::string, Вы можете желание использовать .empty(), потому что это является более общим.

Действительно, J.F. Sebastian комментирует, что, если Вы переключаетесь на использование std::wstring вместо std::string, затем =="", даже не скомпилирует, потому что Вы не можете сравнить строку wchar_t с одним из char. Это, однако, не непосредственно относится к Вашему исходному вопросу, и я на 99% уверен, что Вы не переключитесь на [1 110].

52
ответ дан Community 7 November 2019 в 22:35
поделиться

str.empty () никогда не медленнее, но мог бы быть быстрее, чем ул. == "". Это зависит от реализации. Таким образом, необходимо использовать str.empty () на всякий случай.

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

Кроме проблем производительности, ответ на Ваш вопрос - да; оба выражения логически эквивалентны.

7
ответ дан Gorpik 7 November 2019 в 22:35
поделиться

Некоторые реализации могли бы протестировать на нулевой символ как первый символ в строке, приводящей к небольшому увеличению скорости по вычислению размера строки.

я полагаю, что это не распространено как бы то ни было.

1
ответ дан Jesse Dearing 7 November 2019 в 22:35
поделиться

Да (str.empty() == (str == "")) всегда* верен для std::string. Но помните, что string может содержать '\0' символы. Таким образом даже при том, что выражение s == "" может быть ложью, s.c_str() может все еще возвратить пустую струну до. Например:

#include <string>
#include <iostream>
using namespace std;

void test( const string & s ) {
    bool bempty = s.empty();
    bool beq = std::operator==(s, ""); // avoid global namespace operator==
    const char * res = (bempty == beq ) ? "PASS" : "FAIL";
    const char * isempty = bempty ? "    empty " : "NOT empty ";
    const char * iseq = beq ? "    == \"\"" : "NOT == \"\"";
    cout << res << " size=" << s.size();
    cout << " c_str=\"" << s.c_str() << "\" ";
    cout << isempty << iseq << endl;
}

int main() {
    string s;          test(s); // PASS size=0 c_str=""     empty     == ""
    s.push_back('\0'); test(s); // PASS size=1 c_str="" NOT empty NOT == ""
    s.push_back('x');  test(s); // PASS size=2 c_str="" NOT empty NOT == ""
    s.push_back('\0'); test(s); // PASS size=3 c_str="" NOT empty NOT == ""
    s.push_back('y');  test(s); // PASS size=4 c_str="" NOT empty NOT == ""
    return 0;
}

** запрет перегрузки operator== в глобальном пространстве имен, как другие упомянули*

3
ответ дан jwfearn 7 November 2019 в 22:35
поделиться

Да это эквивалентно, но позволяет базовому коду изменять реализацию того, что пустой () на самом деле означает в зависимости от OS/Hardware/anything, и не влияют на Ваш код вообще. Существует подобная практика в Java и.NET

0
ответ дан Ray Booysen 7 November 2019 в 22:35
поделиться

Обычно, да.

, Но если кто-то решает переопределить оператор затем, все ставки прочь:

bool operator == (const std::string& a, const char b[])
{
    return a != b; // paging www.thedailywtf.com
}
1
ответ дан John Carter 7 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: