频道栏目
首页 > 程序开发 > 软件开发 > C++ > 正文
C++ vector::erase和无参构造函数的调用(代码教程)
2018-02-12 12:01:09      个评论    来源:theArcticOcean  
收藏   我要投稿

vector::erase

C++ vector的元素删除,源码是这样的:

template <class _Tp, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
typename vector<_Tp, _Allocator>::iterator
vector<_Tp, _Allocator>::erase(const_iterator __position)
{
#if _LIBCPP_DEBUG_LEVEL >= 2
    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
        "vector::erase(iterator) called with an iterator not"
        " referring to this vector");
#endif
    _LIBCPP_ASSERT(__position != end(),
        "vector::erase(iterator) called with a non-dereferenceable iterator");
    difference_type __ps = __position - cbegin();
    pointer __p = this->__begin_ + __ps;
    this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
    this->__invalidate_iterators_past(__p-1);
    iterator __r = __make_iter(__p);
    return __r;
}

可知,C++将被删除部分的后面所有元素作为一个集合向前移动了。

所以,假设我们需要清空元素,不要这样写:

int main()
{
    vector<int> v_int;
    for(int i=0;i<10;i++){
        v_int.push_back(i+1);
    }
    int size = v_int.size();
    vector<int>::iterator it = v_int.begin();
    while(size--) {
        cout<<*it<<" ";
        v_int.erase(it++);   // attention !
        cout<<"size: "<<v_int.size()<<endl;
    }
    return 0;
}

它得到结果是这样的:

1 size: 9
3 size: 8
5 size: 7
7 size: 6
9 size: 5

将例子中的it++改成it即可,那样才能清空所有的元素。

无参构造函数的调用

形如Base instance()会调用类的无参构造函数吗?

答案是否定的,C++会将其解释成返回Base对象的函数。

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

class Base{
public:
    Base(){ cout<<"Base()..\n"; }
    Base(string str){ cout<<str<<endl; }
    ~Base(){ cout<<"~Base().. \n"; }
};

int main()
{
    //Base ins(); //empty parentheses interpreted as a function declaration
    Base ins;     //ok
    Base ins2("hello world");  //ok
    return 0;
}

不过有意思的是,有参构造函数却是可以被这样调用的。

有时,我们会遇到这样的函数:

void show(const Base &b){
    //...
}

需要给该函数传递一个存储在栈中的变量,要构造这样的变量,我们可以简单地这样写Base(). 它等价于Base b.

即:

    //show(Base("hello"));  //ok. output: hello     it's equal to 'Base b("hello"); show(b);'
    //show(Base());         //ok. output: Base()..  it's equal to 'Base b; show(b);'
点击复制链接 与好友分享!回本站首页
上一篇:C++虚函数表的应用详解
下一篇:最后一页
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站