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源码分析
- 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); }
- 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版本是不是如此呢?查看源码:
- 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; }
- 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/
网友评论