当前位置: 首页 > news >正文

岱山县网站建设有限公司网站建设 中企动力重庆

岱山县网站建设,有限公司网站建设 中企动力重庆,设计网站推荐外网,ai智能写作网站有时,我们可能需要一个包含指针的容器.比如存放一些不可拷贝的对象或者想在容器里存放基类以实现多态.尽管我们可以直接定义存放指针的STL容器,不过这样并不方便,我们得处处小心,在清空或删除容器里的元素时我们要保证异常安全地回收指针所指向的对象,以防内存泄漏. 一个好的办…有时,我们可能需要一个包含指针的容器.比如存放一些不可拷贝的对象或者想在容器里存放基类以实现多态.尽管我们可以直接定义存放指针的STL容器,不过这样并不方便,我们得处处小心,在清空或删除容器里的元素时我们要保证异常安全地回收指针所指向的对象,以防内存泄漏. 一个好的办法是使用共享智能指针的容器,如std::vectorboost::shared_ptrT ,不过这样做的话智能指针所带来的开销显然太大了. Boost.pointer_container提供了和标准相似的容器,只是它维护的是指针所指的对象. 要使用Boost.pointer_container只需包含下面的头文件即可 #include boost/ptr_container/ptr_container.hpp一个简单的例子 #include iostream#include boost/ptr_container/ptr_container.hpp using namespace std;using namespace boost; struct base{  //基类    virtual void print()0;        virtual ~base(){}}; struct A:base{ //A,从base继承    void print(){        cout  A  endl;    }}; struct B:base{ //B,从base继承    void print(){        cout  Here is B  endl;    }}; struct C:base{ //C,从base继承    C(string str)        :m_str(str){}    void print(){        cout  C:  m_str  endl;    }private:    string m_str;}; int main(){    ptr_vectorbase data;    data.push_back(new A);    data.push_back(new B);    data.push_back(new C(hello));    data.push_back(new C(world));       for(ptr_vectorbase::iterator itrdata.begin(); itr!data.end(); itr)    {        itr-print();    }     return 0;} 运行结果: A Here is B C:hello C:world 应该注意到,这里没有内存泄漏,在ptr_vectorbase析构时会删除容器内指针所指向的对象. 本例中,我们使用了ptr_vector,在Boost.pointer_container库中包含的指针容器有: ptr_vector ptr_list ptr_deque ptr_array ptr_set ptr_multi_set ptr_map ptr_multimap 除ptr_array以外,其它所有的容器都能与STL一一对应起来,除了以指针方式存入以外,使用方法没什么区别.至于ptr_array,它不过是Boost.Array的简单包装罢了. 毫无悬念地,这些指针容器是STL兼容的,比如上面的循环打印用这句代替: for_each(data.begin(), data.end(), mem_fun_ref(base::print)); 其它问题 空值 如果向容器中插入NULL, 默认情况是抛出一个异常. 如果想让指针容器能保存NULL指针,那么声明容器时就必须使用nullable来包装数据类型,例如: boost::ptr_vector boost::nullablebase animals_type; 克隆能力 默认情况下,容器或迭代器之间的赋值并不是简单的指针复制,而是使用拷贝构造函数产生一个新的拷贝.比如: struct C:base{    C(string str)        :m_str(str){        cout  C:con   this     str endl;    }     C(){        cout  C:con   this endl;    }     C(const C oth){        m_str  oth.m_str;        cout  C:copy   this     m_str endl;    }     ~C(){        cout  C:decon   this endl;    }    void print(){        cout  C:  m_str  endl;    }private:    string m_str;}; int main(){    ptr_vectorC data;    data.push_back(new C(hello));    data.push_back(new C(world));       ptr_vectorC dataX  data;     return 0;} 显示两次构造,两次拷贝,四次析构. 说明ptr_vectorC dataX data;使用了拷贝构造函数生成了自己的对象实例. 我们可以通过定义T* new_clone(const T)来改变这种行为: 在上例的main()函数之前定义: C* new_clone(const C orig){    cout  C:clone  endl;    return new C(cloned);} 这次运行结果显示它调用了两次new_clone而不是拷贝了.
http://www.zqtcl.cn/news/625693/

相关文章:

  • 宁波建网站哪家值得信赖wordpress 默认图片路径
  • 网站代运营公司天津手机版建站系统
  • 公司网站怎么做才高大上大数据营销的含义
  • 做网站点做关于什么的网站
  • 网站建设服务费税率多少汕头模板建站流程
  • 网站 建设实验小结做淘宝客优惠券网站还是APP赚钱
  • 付银行的网站建设费的会计科目网站建设前端
  • 做网站题材海南网站建设软件
  • 门户网站建设 考核从零开始学做网站cdsn
  • 百胜网站建设秀屿区建设局网站
  • 公司招聘做哪家网站建筑网站开发
  • 网站建设文案详情一条龙平台
  • 四站合一网站建设公司权威的手机网站制作
  • 自主网站建站上海金瑞建设集团网站
  • 阿里云网站建设方案书中山市公司企业网站的选择
  • 网站建设管理工作制度知名网站建设加盟合作
  • 网站定制公司推荐wordpress 插件 封面
  • 企业手机网站建设行情做外贸哪个网站比较好2017
  • 专业网站制作电话软件推广
  • 免费建站系统博客海外网站搭建
  • 网站建设与制作视频教学站酷网图片
  • 网站开发还有哪些万维网申请网站域名
  • 做网站费用上海判断网站做的好坏
  • 有了域名和空间怎么建网站哪些公司需要网页电商设计师
  • 网站开站备案深圳创业补贴10万
  • 圆通我做网站拉上海建站系统
  • 对于做网站有什么要求新闻发布会视频
  • 网站建设专业就业前景成都房产信息网 官网
  • 西宁网站建设公司排行网站查询域名ip解析
  • 柳州企业网站开发公司如何做网站首页图