美文网首页
std::vector应该使用size还是empty

std::vector应该使用size还是empty

作者: dnsir | 来源:发表于2018-11-19 23:29 被阅读11次

1 引言

如下代码段:

std::vector<std::string> v;
if(v.size() > 0)
{
    std::cout<< "none null v" << std::endl;
}

在使用CLion时,语法检查工具会提示使用empty(),不建议使用size(),为什么呢?

2 std::vector的empty与size源码分析

  1. size()函数实现
      // [23.2.4.2] capacity
      /**  Returns the number of elements in the %vector.  */
      size_type
      size() const _GLIBCXX_NOEXCEPT
      { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
  1. empty()函数实现
/**
       *  Returns true if the %vector is empty.  (Thus begin() would
       *  equal end().)
       */
      bool
      empty() const _GLIBCXX_NOEXCEPT
      { return begin() == end(); }

从函数实现来看,stl::vector的empty和size的时间复杂度应该是一样的,但为什么很多文章都说建议使用empty而不是size呢?那是因为某些标准库的empty和size的时间复杂度不一样,具体需要查看STL的源码。

3. std::list的empty和size源码分析

网络很多文章提到std::list的size时间复杂度为O(n),empty的时间复杂度为常熟,那么在gcc5.0版本是不是如此呢?查看源码:

  1. std::list的empty实现
// [23.2.2.2] capacity
      /**
       *  Returns true if the %list is empty.  (Thus begin() would equal
       *  end().)
       */
      bool
      empty() const _GLIBCXX_NOEXCEPT
      { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
  1. std::list的size实现
 /**  Returns the number of elements in the %list.  */
      size_type
      size() const _GLIBCXX_NOEXCEPT
      { return this->_M_node_count(); }

比较发现两个函数的时间复杂度都是常数。

4 empty与size比较

究竟应该使用empty还是size请看具体的源码实现。

5 参考文章

https://stackoverflow.com/questions/228908/is-listsize-really-on
http://www.cplusplus.com/site/versions/

相关文章

网友评论

      本文标题:std::vector应该使用size还是empty

      本文链接:https://www.haomeiwen.com/subject/ozpzfqtx.html