C++ generic tools -- from C++ Standard Library
今晚学了一下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容器对元素的要求。
C++ generic tools -- from C++ Standard Library的更多相关文章
- The Python Standard Library
The Python Standard Library¶ While The Python Language Reference describes the exact syntax and sema ...
- [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II
[译]The Python Tutorial#Brief Tour of the Standard Library - Part II 第二部分介绍更多满足专业编程需求的高级模块,这些模块在小型脚本中 ...
- c++学习书籍推荐《Beyond the C++ Standard Library》下载
百度云及其他网盘下载地址:点我 作者简介 Björn Karlsson works as a Senior Software Engineer at ReadSoft, where he spends ...
- Python语言中对于json数据的编解码——Usage of json a Python standard library
一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...
- C++ Standard Library
C++ Standard Library *注:内容主要是对參考1的学习记录.知识点与图片大都来源于该书, 部分知识点与图片来源于參考2. 详细參考信息,见最下方參考. * C++98中新支持的语言特 ...
- C++11新特性——The C++ standard library, 2nd Edition 笔记(一)
前言 这是我阅读<The C++ standard library, 2nd Edition>所做读书笔记的第一篇.这个系列基本上会以一章一篇的节奏来写,少数以C++03为主的章节会和其它 ...
- Python Standard Library
Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...
- Macro definition of snprintf conflicts with Standard Library function declaration
Macro definition of snprintf conflicts with Standard Library function declaration 即将此处的宏定义注释掉,因为在VS2 ...
- [译]The Python Tutorial#10. Brief Tour of the Standard Library
[译]The Python Tutorial#Brief Tour of the Standard Library 10.1 Operating System Interface os模块为与操作系统 ...
随机推荐
- Java 成员变量和局部变量
1.成员变量 在类中定义,用来描述对象将要有什么. 2.局部变量 在类的方法中定义,在方法中临时保存数据. 成员变量和局部变量的区别 作用域不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域 ...
- if、while中变量的作用域问题
我们知道,函数.类会改变当前变量的作用域.if,while等分支循环结构会继承外部作用域,即外部变量对分支循环结构内部可见. 但是C语言不支持if,while等分支循环结构内部作用域对外可见,而PHP ...
- 【洛谷】P2983 [USACO10FEB]购买巧克力Chocolate Buying(贪心)
题目描述 Bessie and the herd love chocolate so Farmer John is buying them some. The Bovine Chocolate Sto ...
- 用户从手机的浏览器访问www.baidu.com,看到的可能跟桌面PC电脑,是不太一样的网页效果,会更适合移动设备使用。请简要分析一下,实现这种网页区分显示的原因及技术原理。
手机的网速问题.屏幕大小.内存.CPU等.通过不同设备的特征,实现不同的网页展现或输出效果.根据useragent.屏幕大小信息.IP.网速.css media Query等原理,实现前端或后端的特征 ...
- 第一个 Windows 界面程序
编译器 使用的编译器为 Visual Studio 2017 菜单栏 -> 文件 -> 新建 -> 项目 选择 Windows 桌面应用程序,然后填好相关信息后点击“确定” 在解决方 ...
- ubuntu apt-get常用命令
apt-cache search package 搜索包apt-cache show package 获取包的相关信息,如说明.大小.版本等sudo apt-get install package 安 ...
- 排除maven jar冲突 maven tomcat插件启动报错 filter转换异常
最近在搞一个ssm+shiro的整合 用的maven tomcat插件 启动的时候报错,提示 maven org.springframework.web.filter.CharacterEncodin ...
- c++获取lua嵌套table某属性的值
开发环境:vs2012 lua版本:LuaJIT-2.0.2 lua文件作为配置文件,c++读取这个配置. lua配置结构如下 SceneConfig = { [] = { name =}, [] = ...
- 证件照制作:使用PS打印一寸照片
1. 打开文件,文件-打开-选择要操作的图片: 2. 修改图片尺寸,图像-图像大小,弹出对话框后,设置 宽度:2.5cm,高度:3.5cm,分辨率:300 像素/英寸: 3. 为要打印的照片设置白边, ...
- 塔防游戏 Day1
1. 创建地图 如上图所示,白色方块为可以放置塔楼的区域,粉红色区域为敌人的行走区域,绿色方块处为起始点,黄色方块点为终止点. 2. 控制游戏的视野 public class ViewScript : ...