设为首页 加入收藏

TOP

3.4.5 应用于标准容器
2013-10-07 13:14:01 来源: 作者: 【 】 浏览:77
Tags:3.4.5 用于 标准 容器

3.4.5  应用于标准容器

有两种方式可以将shared_ptr应用于标准容器(或者容器适配器等其他容器)。

一种用法是将容器作为shared_ptr管理的对象,如shared_ptr<list<T> >,使容器可以被安全地共享,用法与普通shared_ptr没有区别,我们不再讨论。

另一种用法是将shared_ptr作为容器的元素,如vector<shared_ptr<T> >,因为shared_ptr支持拷贝语义和比较操作,符合标准容器对元素的要求,所以可以实现在容器中安全地容纳元素的指针而不是拷贝。

标准容器不能容纳auto_ptr,这是C++(www.cppentry.com)标准特别规定的(读者永远也不要有这种想法)。标准容器也不能容纳scoped_ptr,因为scoped_ptr不能拷贝和赋值。标准容器可以容纳原始指针,但这就丧失了容器的许多好处,因为标准容器无法自动管理类型为指针的元素,必须编写额外的大量代码来保证指针最终被正确删除,这通常很麻烦很难实现。

存储shared_ptr的容器与存储原始指针的容器功能几乎一样,但shared_ptr为程序员做了指针的管理工作,可以任意使用shared_ptr而不用担心资源泄漏。

下面的代码示范了将shared_ptr应用于标准容器的用法:

  1. #include <boost/make_shared.hpp> 
  2. int main()  
  3. {  
  4.     typedef vector<shared_ptr<int> > vs;    //一个持
    有shared_ptr的标准容器类型  
  5.     vs v(10);                               //声明一
    个拥有10个元素的容器,元素被                                          
    //初始化为空指针  
  6.  
  7.     int i = 0;  
  8.     for (vs::iterator pos = v.begin(); pos != v.end(); ++pos)  
  9.     {  
  10.         (*pos) = make_shared<int>(++i);     //使用工厂函数赋值  
  11.         cout << *(*pos) << ", ";            //输出值  
  12.     }  
  13.     cout << endl;  
  14.  
  15.     shared_ptr<int> p = v[9];  
  16.     *p = 100;  
  17.     cout << *v[9] << endl;  

这段代码需要注意的是迭代器和operator[]的用法,因为容器内存储的是shared_ptr,我们必须对迭代器pos使用一次解引用操作符*以获得shared_ptr,然后再对shared_ptr使用解引用操作符*才能操作真正的值。*(*pos)也可以直接写成**pos,但前者更清晰,后者很容易让人迷惑。vector的operator[]用法与迭代器类似,也需要使用*获取真正的值。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.1 窗口渲染环境 下一篇3.4.8 定制删除器

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: