1

When performing the check:

std::string st = "hello";
bool is_empty = st.size() > 0;

I get the Clang-Tidy warning mentioned above.

Why is it better to use the empty() method instead?

L. F.
  • 19,445
  • 8
  • 48
  • 82
joepol
  • 744
  • 6
  • 22
  • In my opinion it is not always better to use  `empty()` for this. The code will sometimes be harder to read. Consider `if (foo.size() && bar.size() && blarg.size())` as compared to `if (!foo.empty() && !bar.empty() && !blarg.empty())`. The semantics of "if this and this and this has a size" is easier on my brain than "If this is not empty and this is not empty and this is not empty". But I suppose that this boils down to what you are used to. And in C++11 the time complexity of `empty()` and `size()` are both constant. – Krøllebølle Apr 24 '21 at 12:05

1 Answers1

12

According to Clang documentation

readability-container-size-empty

Checks whether a call to the size() method can be replaced with a call to empty().

The emptiness of a container should be checked using the empty() method instead of the size() method. It is not guaranteed that size() is a constant-time function, and it is generally more efficient and also shows clearer intent to use empty(). Furthermore some containers may implement the empty() method but not implement the size() method. Using empty() whenever possible makes it easier to switch to another container in the future.

std::forward_list is and example to a container that doesn't have size() method as seen here : do-all-containers-have-a-size-function

After C++11 time complexity of size() is constant according to its standard by isocpp

Community
  • 1
  • 1
joepol
  • 744
  • 6
  • 22
  • Generally agree, but it may be preferable to use explicit `size` in unit tests since it might lead to better error messages. For example, `CHECK(result.size() == 0)` might produce a failure message such as `CHECK failed: 5 == 0`. – Daniel Steck Nov 08 '21 at 12:49
  • Link is dead :\ – MichaelChirico Jan 24 '23 at 19:25