Pair对
- class Pair 可以将两个值视为一个单元,c++标准库中任何两个需要返回两个值的地方都要pair。
- pair中的make_pair函数可以不显式指定类型的构造一个pair对象,如:
void f(std::pair<int, const char*>);
void g(std::pair<const int, std:: string>);
……
void foo()
{
f(std::make_pair(42, "hello"));
g(std::make_pair(42, "hello"));
}
上面的代码中,并没有显示的使用类似于
f(std::make_pair<int, const char*>(42, "hello"))
这样繁杂的写法,即使make_pair的两个值不完全符合要求,在template的帮助下也能顺利工作。
而当一句代码准确的指出其中的类型时,产生出来的pair就有绝对明确的类别。如:
std::pair (42, 7.77)与std::pair(42, 7.77)是有区别的。后者生成的元素,默认的类型是double(无任何修饰符的浮点字面常数被视为double型),当我们使用重载函数的时候,准确的类型非常重要。
auto_ptr
- auto_ptr是c++提供的一种智能型指针,帮助程序员“防止被异常抛出时发生泄漏资源”。
- auto_ptr是一种这样的指针:它是“它所指向的对象”的拥有者(owner),所以当身为对象拥有者的auto_ptr被销毁时,该对象也会被自动销毁。auto_pair要求一个对象只有一个拥有者,严禁一物二主。
- auto_ptr的接口与一般的指针非常类似:星号操作符用来解引用,->操作符用来指向对象中的成员,但是,所有的指针运算(包括++)都没被定义(是件好事)。
- auto_ptr<>不允许使用一般指针惯用的赋值(assign)初始化方式,你必须直接用数值来完成初始化。如
std::auto_ptr<ClassA> ptr1(new ClassA); //OK
std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
- auto_ptr所界定的是一种严格的拥有权观念,也就是说,由于一个auto_ptr会删除所指向的对象,所以这个对象绝对不能同时被别的对象拥有。绝对不能出现多个auto_ptrs同时拥有一个对象的情况。但是copy构造函数和assignment操作符通常会导致这个问题。解决的办法是:令auto_ptr的copy构造函数和assignment操作符将对象的所有权交出去。如:
//通过一个对象初始化auto_ptr
auto_ptr<ClassA> ptr1( new ClassA);
//拷贝函数
//将所有权(归属,ownership)从ptr1转移到ptr2
auto_ptr<ClassA> ptr2(ptr1);
在上面代码的最后一句中,拷贝构造函数在拷贝的同时将对象的所有权从ptr1转移到ptr2。此后ptr2拥有这个new出来的对象,而ptr1不再拥有,这样对象只会被delete一次——在ptr2被销毁的时候。赋值的动作也类似。
但是如果ptr2在赋值之前拥有另外的一个对象,那么赋值操作会调用delete,将该对象删除。 - 只有auto_ptr可以用来当作另一个auto_ptr的初值,普通指针不可以。
Chapt.4 Utilities——auto_ptr & pair
时间: 2024-10-27 00:22:42