Для него есть рубиновый камень - SocialShares
В настоящее время он поддерживает следующие социальные сети:
Использование:
: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
Это должно быть. 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()
.
Да. Вот соответствующая реализация от 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].
str.empty () никогда не медленнее, но мог бы быть быстрее, чем ул. == "". Это зависит от реализации. Таким образом, необходимо использовать str.empty () на всякий случай.
Это немного похоже на использование ++ я вместо меня ++ для увеличения счетчика (предположение, что Вам не нужен результат самого инкрементного оператора). Ваш компилятор мог бы оптимизировать, но Вы ничего не теряете использование ++ я и могли бы выиграть что-то, таким образом, Вы - более обеспеченное использование ++ я.
Кроме проблем производительности, ответ на Ваш вопрос - да; оба выражения логически эквивалентны.
Некоторые реализации могли бы протестировать на нулевой символ как первый символ в строке, приводящей к небольшому увеличению скорости по вычислению размера строки.
я полагаю, что это не распространено как бы то ни было.
Да (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==
в глобальном пространстве имен, как другие упомянули*
Да это эквивалентно, но позволяет базовому коду изменять реализацию того, что пустой () на самом деле означает в зависимости от OS/Hardware/anything, и не влияют на Ваш код вообще. Существует подобная практика в Java и.NET
Обычно, да.
, Но если кто-то решает переопределить оператор затем, все ставки прочь:
bool operator == (const std::string& a, const char b[])
{
return a != b; // paging www.thedailywtf.com
}