今晚学了一下C++标准程序库, 来简单回顾和总结一下。

  1.pair 结构体

// defined in <utility> , in the std namespace
namespace std{
template <class T1, class T2>
struct pair{
// type names for the values
typedef T1 first_type;
typedef T2 second_type; // member
T1 first;
T2 second; // default constructor
// implicit invoke the built-in types to provide a default value
pair():first(T1()),second(T2()){
} // constructor for two default values
pair(const T1& a,const T2& b)
: first(a), second(b){
} // copy constructor with implicit conversions,使用模板是因为构造过程中可能需要隐式类型转换。
template<class U,class V>
pair(const pair<U,V>& p)
: first(p.first), second(p.second){
}
}; //comparisions
template <class T1,class T2>
bool operator == (const pair<T1,T2>&, const pair<T1,T2>&);
template <class T1,class T2>
bool operator < (const pair<T1,T2>&,const pair<T1,T2>&);
// similar : != . <, = , >
template <class T1,class T2>
pair<T1,T2> make_pair(const T1&,const T2&);
}

 2. make_pair(): 使你无需写出型别,就可以生成一个pair对象.

namespace std{
//create value pair only by providing the values.
template <class T1,class T2>
pair<T1,T2> make_pair(const T1& x,constT2& y){
return pair<T1,T2>(x,y);
}
}

可以使用 std::make_pair(,'@'); 而不用写成: std::make_pair<int,char>(,'@');

3. 智能指针 auto_ptr

  为什么要使用智能指针? 

    如果一开始获取的资源被绑定到局部对象上,当函数退出时,对象的析构函数会被调用, 从而释放资源。 会出现2个常见的问题:

      1.经常忘记delete操作

      2.当函数出错返回时,可能还没有执行delete

      可以使用捕捉所有异常来解决,然后在最后执行delete操作。 但是比较繁琐!不是优良的出现风格,而且复杂易出错。

  智能指针的作用: 保证无论在何种情况下, 只要自己被摧毁, 就一定连带释放其所指的资源; 由于智能指针本身就是局部变量,所以无论是正常退出还是异常退出, 只要函数退出,这个局部变量就会被销毁。 这也说明了,局部对象虽然也会摧毁, 但是其绑定的资源仍然没有得到释放。

  智能指针的定义: auto_ptr是这样的指针,它是所指向对象的owner!而且是唯一owner, 一个对象只能对应一个智能指针。

  智能指针被定义在头文件<memory>

  智能指针声明:  std::auto_ptr<ClassA> ptr(new ClassA);  使用了auto_ptr 之后就不需要使用catch和delete了。

  智能指针的访问: 类似一般指针,有 *, -> 和 = 操作, 但是不允许将普通指针直接赋值给 auto_ptr

  智能指针的拥有权关系:

    => 转让: 通过auto_ptr 的copy constructor 来交接拥有权。这种方式使得赋值操作改变了source 变量, 违反了STL对容器元素的要求,所以auto_ptr不允许作为STL的容器元素。

std::auto_ptr<ClassA> ptr1(new ClassA);
std::auto_ptr<ClassA> ptr2(ptr1); // if ptr2 binded another obj, it will be deleted before. then ptr1 is a null pointer!

  auto_ptr的用法:(来源于拥有权转让的特殊用法)

    (1) 某函数是auto_ptr 的起点: 必须将拥有权传递出去,否则就会在函数退出时被删除, 这里是数据的起点。

    (2) 某函数是auto_ptr 的终点: 如果不需要再使用auto_ptr, 就不用传递出去即可, 会被自动删除。

  上面是auto_ptr的值传递, 如果是引用传递和const类型的呢?

  by reference: 通过reference传递时,无法知道拥有权是否被转移, 所以这种方式的设计不推荐。

  by const: 无法变更控制权(但可以修改对象属性), 安全性增强, 在STL中很多接口需要内部拷贝都通过const reference。

  使用auto_ptr需要注意:

    (1) auto_ptr 对象之间不能共享所有权。

    (2) auto_ptr 没有针对array而设计, 因为使用delete , 而没有delete[]。

    (3) auto_ptr 只用当拥有对象的智能指针被销毁时, 对象才会被销毁。

    (4) auto_ptr 不满足STL容器对元素的要求。

最新文章

  1. 深入理解DOM事件机制系列第一篇——事件流
  2. InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集
  3. 10. JEB1.5 插件编写二
  4. Julia中文教程资源.txt
  5. MapReduce编程系列 — 5:单表关联
  6. PAT 64.Complete Binary Search Tree
  7. Quartz 2D中的基本图形绘制
  8. java开发之阿里云对象存储OSS和云数据库Memcache的使用
  9. java-信息安全(一)-BASE64,MD5,SHA,HMAC
  10. MVC传参数给js的时候 如果是数值 变量要进行一下转换才能正确识别 例如var aaa = parseInt(&#39;@Model.ClickIndex&#39;);
  11. 用xcode9编译出ios越狱机程序使用的dylib
  12. Qt+QGis二次开发:矢量图层的显示样式
  13. Oracle 数据库启动过程
  14. 学习笔记31—endnote设置
  15. JavaScript中的内置对象-8--1.Array(数组)-Array构造函数; 数组的栈方法; 数组的转换方法; 数组的操作方法; 删除-插入-替换数组项; ECMAScript为数组实例添加的两个位置方法;
  16. PgSQL基础之 安装postgresql数据系统
  17. Spring Boot 项目发布到 Tomcat 服务器
  18. Android控件之HorizontalScrollView 去掉滚动栏
  19. 【NOI】2004 郁闷的出纳员
  20. SQLSERVER2008 R2的端口设置

热门文章

  1. java web 程序---登陆的验证码实现显示
  2. webpack快速入门(一):安装
  3. EFCodeFirst使用Nuget更新数据库
  4. 二十二 synchronized同步方法
  5. ALSA声卡09_从零编写之参数设置_学习笔记
  6. 【BZOJ】2456 mode(乱搞)
  7. GRE and VXLAN with Open vSwitch
  8. 第十章 消息驱动的微服务: Spring Cloud Stream
  9. [ExtJs6] 环境搭建及创建项目
  10. js调用activeX插件 报异常:TypeError:对象不支持 属性方法