STL------通用工具
来源:互联网 发布:苹果mac重装系统教程 编辑:程序博客网 时间:2024/06/08 00:19
1.1 Pairs(对组)
class pair可以将两个值视为一个单元。stl内多出使用了这个class,尤其容器类别map和multimap,就是使用pairs来管理其键值/实值(key/value)的成对元素。任何函数需返回两值,也需要pair。
Structure pair定义于<utility>:
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
*-T1() and T2() force initialization for built-in types
*/
pair()
:first(T1()),second(T2()){
}
//constructor for two values
pair(const T1& a,const T2&b)
:fist(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){
}
};
}
//comparisons
template <class T1,class T2>
bool operator==(const pair <T1,T2>&, const pair<T1,T2>&);
....//similar :!=,<,>,>=,<=
//convenience function to create a pair
template<class T1,class T2>
pair<T1,T2> make_pair(const T1&,const T2&);
pair之间的比较
为了比较两个pair对象,如果两个pair对象的所有元素都相等,才视为相等(equal)
namespace std{
template<class T1,class T2>
bool operator==(const pair<T1,T2>& x,const pair<T1,T2>& y){
return x.first==y.first && x.second==y.second;
}
}
1.1.1 便捷函数make_pair()
template function 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,const T2&y){
return pair<T1,T2>(x,y);
}
}
1.2 Class auto_ptr
本节描述auto_ptr型别。C++ STL提供的auto_ptr是一种智能型指针(smart_point),帮助程序员防止"被异常抛出时发生资源泄露"。auto_ptr只是针对某个问题而设计,对于其它问题,auto_ptr无能为力。
1.2.1 auto_ptr设计动机
函数的操作经常依以下模式进行:
1.获取一些资源;
2.执行一些动作;
3.释放所获取的资源;
如果一开始获取的资源被绑定于局部对象(local objects)身上,当函数退出时,它们的析构函数(destructor)被调用,从而自动释放这些资源。然而事情并不总是如此顺利,如果资源是显示手法(explicitly)获得,而且没有被绑定在任何对象身上,那就必须以显示手法释放。这种情形常常发生在指针身上。
一个典型的例子就是运用new和delete来产生和销毁对象:
void f()
{
classA* ptr =new classA;//create an object explicitly;
... //peform some operations
delete ptr; //clean up(destrory the object explicitly)
}
这个函数是麻烦的根源,我们经常会忘记delete动作,防止这种资源遗失的常见办法是捕捉所有异常。例如:
void f()
{
classA* ptr=new classA;
try{
.... //peform some operations
}
catch(...){ //for any exception
delete ptr; //clean up
throw; //rethrow the exception
}
delete prt; //clean up on normal end
}
如果使用智能指针,情况大不一样。
auto_ptr是这样的指针:它是"它所指的对象"的拥有者(owner)。所以,当身为对象拥有者的auto_ptr被摧毁时,该对象也将被摧毁。auto_ptr要求一个对象智能有一个拥有者,严禁一物二主。
下面是上面改写后的版本;
//header firle for auto_ptr
#include<memory>
void f()
{
//create and initialize an auto_ptr
std::auto_ptr<Class A> ptr(new ClassA);
.... //peform some operations
}
不再需要delete ,也不需要catch。auto_ptr的借口与一般指针非常相似:
operator* 用来提取所指对象,operator->用来指向对象中的成员。然而,所有指针(包括++)都没有定义(这可能是件好事,因为指针算术本是一大麻烦来源)。
注意:auto_ptr<>不允许使用一般指针惯用的assign初始化方式,必须直接使用数值完成初始化:
std::auto_ptr<ClassA> ptr(new ClassA); //OK
std::auto_ptr<ClassA>ptr2 =new ClassA; //ERROR
1.2.2 auto_ptr拥有权(Ownership)的转移
auto_ptr所界定的乃是一种严格的拥有权观念。也就是说,由于一个auto_ptr会删除所指定对象,所以这个对象绝对不能同时被其它对象"拥有"。绝对不应该出现多个autor_ptrs同时拥有一个对象的情况。
这个条件导致了一个问题:auto_ptr的copy构造函数和assignment操作符应该如何运作呢?
令auto_ptr的copy构造函数和assignment操作符将对象拥有权交出去。下例:copy构造函数的运用:
//initialize an auto_ptr with a new object
std::auto_ptr<ClassA> ptr1(new ClassA);
//copy the auto_ptr
//--transfer ownership from ptr1 to ptr2
std::auto_ptr<ClassA> ptr2(ptr1);
....待续
- STL通用工具
- STL------通用工具
- STL通用工具--Pairs
- STL学习笔记之通用工具
- STL概览-通用工具pair,auto_ptr,std::rel_ops(二)
- 转】STL摘要一:通用工具(pair,auto_ptr,std::rel_ops)
- STL概览-通用工具pair,auto_ptr,std::rel_ops
- STL通用算法
- STL通用算法
- STL 通用算法
- STL 中的通用容器
- 通用工具Utilities(一):STL中auto_ptr的实现以及auto_ptr_ref的理解
- 开发通用工具,不进则退
- 通用工具类
- 通用数据库连接工具
- 反射通用工具类
- 通用XML处理工具
- UtilTool通用工具类
- 移植dm9000ae驱动到u-boot
- Symbian PKG 文档
- 浅析C++中的this指针
- Linux中部分命令
- PING命令实现及知识
- STL------通用工具
- delphi的一些扩展语法
- sql server中如何隐藏【系统表】
- Js 分栏
- T_SQL存储过程读写图片,文件等(BLOB)字段
- SQLSERVER备份和还原
- 北京···
- 海量数据处理--题目
- 浅谈MS-SQL锁机制