STL学习笔记之通用工具
1 Pairs(对组)
Class Pair 可以将两个值视为一个单元。C++标准程序库中多处使用了这个Class。容器类别Map和Multimap就是使用该类来管理其键值/实值的承兑元素的。任何函数需要两个值,也需要Pair。
Pair定义于<utility>中,其被定义为一个struct,而不是一个类,故所有成员都为Public。其数据成员为first和second。
Pair之间的比较:如果两个pair对象内的所有元素都相等,这两个pair对象就被视为相等(equal)。其中第一个元素的比较优先级较高。
Make_pair():
Namespace std{
Template<class T1,class T2>
Pair<T1,T2>make_pair(const T1 &x,const T2&y)
Return pair<T1,T2>(x,y);
}
2 Class auto_ptr
Auto_ptr是这样一种指针,任何情况下,只要自己被销毁,就一定连带释放其所指资源。Auto_ptr要求一个对象只能有一个拥有者,严禁一物二主。
使用方法:
#include<memory>
Void f(){
std::auto_ptr<classA> ptr1(new ClassA);//ok
std::auto_ptr<classA> ptr2 = new ClassA;//error
......
}
注意:auto_ptr<>不允许使用一般指针管用的赋值初始化方式,必须直接使用数值来完成初始化。
所有权转移:当auto指针A、B都使用同一个对象进行初始化时,便会出现一个问题:当A销毁之后,A所指向的对象也被释放了,那么B指向哪里?这是很危险的行为。所有权转移便是为了解决这样的问题。
//ptr1指向新生的对象X
std::auto_ptr<classA> ptr1(new ClassA);
//下面这句神奇的代码之后,ptr1不再拥有对对象X的控制权,它会指向null,当然会被销毁,此时,对象X的控制权转移到了ptr2(要如此这般,需要注意的是只有auto 指针可用哪来当做另一个auto指针的初值)
std::auto_ptr<classA> ptr2(ptr1);
使用auto_ptr的注意点:
1) Auto_ptrs之间不能共享拥有权
2) 并不存在针对array而设计的auto_ptrs
3) Auto_ptrs并不是万能的智能型指针
4)Auto_ptrs不满足STL容器对元素的要求(因为在Copy和assign工作之后,原本的auto_ptr和新产生的auto_ptr并不相等)