Chapt.4 Utilities——auto_ptr & pair

Pair对

  1. class Pair 可以将两个值视为一个单元,c++标准库中任何两个需要返回两个值的地方都要pair。
  2. pair中的make_pair函数可以不显式指定类型的构造一个pair对象,如:
    1. void f(std::pair<int, const char*>);
    2. void g(std::pair<const int, std:: string>);
    3. ……
    4. void foo()
    5. {
    6. f(std::make_pair(42, "hello"));
    7. g(std::make_pair(42, "hello"));
    8. }

    上面的代码中,并没有显示的使用类似于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

  1. auto_ptr是c++提供的一种智能型指针,帮助程序员“防止被异常抛出时发生泄漏资源”。
  2. auto_ptr是一种这样的指针:它是“它所指向的对象”的拥有者(owner),所以当身为对象拥有者的auto_ptr被销毁时,该对象也会被自动销毁。auto_pair要求一个对象只有一个拥有者,严禁一物二主。
  3. auto_ptr的接口与一般的指针非常类似:星号操作符用来解引用,->操作符用来指向对象中的成员,但是,所有的指针运算(包括++)都没被定义(是件好事)
  4. auto_ptr<>不允许使用一般指针惯用的赋值(assign)初始化方式,你必须直接用数值来完成初始化。如
    1. std::auto_ptr<ClassA> ptr1(new ClassA); //OK
    2. std::auto_ptr<ClassA> ptr2 = new ClassA; //ERROR
  5. auto_ptr所界定的是一种严格的拥有权观念,也就是说,由于一个auto_ptr会删除所指向的对象,所以这个对象绝对不能同时被别的对象拥有。绝对不能出现多个auto_ptrs同时拥有一个对象的情况。但是copy构造函数和assignment操作符通常会导致这个问题。解决的办法是:令auto_ptr的copy构造函数和assignment操作符将对象的所有权交出去。如:
    1. //通过一个对象初始化auto_ptr
    2. auto_ptr<ClassA> ptr1( new ClassA);
    3. //拷贝函数
    4. //将所有权(归属,ownership)从ptr1转移到ptr2
    5. auto_ptr<ClassA> ptr2(ptr1);

    在上面代码的最后一句中,拷贝构造函数在拷贝的同时将对象的所有权从ptr1转移到ptr2。此后ptr2拥有这个new出来的对象,而ptr1不再拥有,这样对象只会被delete一次——在ptr2被销毁的时候。赋值的动作也类似。
    但是如果ptr2在赋值之前拥有另外的一个对象,那么赋值操作会调用delete,将该对象删除。

  6. 只有auto_ptr可以用来当作另一个auto_ptr的初值,普通指针不可以。

来自为知笔记(Wiz)

Chapt.4 Utilities——auto_ptr & pair

时间: 2024-10-27 00:22:42

Chapt.4 Utilities——auto_ptr & pair的相关文章

Chapt.4 Utilities——辅助函数

2015年05月19日算法程序库中有三个辅助函数,一个用来在二值中判断最大的,一个用来判断最小的,一个用来交换 Min & Max min 和 max 通常可以用三元操作符?:来判断大小,但是,algorithm算法库中还提供另外一个版本,接受一个额外的template参数作为比较准则: template <class T, class Compare> inline const T& min(const T& a, const T& b, Compare co

C++学习 之pair

Pair类型概述 pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a; 表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化. pair<string, string> a("James", "Joy"); 也可以像上面一样在定义的时候直接对其初始化. 由于pair类型的使用比

高效使用auto_ptr

auto_ptr是C++标准库中<memory>为了解决资源泄漏的问题提供的一个智能指针类模板.auto_ptr的实现原理是RAII,在构造的时获取资源,在析构的时释放资源. 下面通过一个例子掌握auto_ptr的使用和注意事项. 事例类的定义: #pragma once #include <iostream> using namespace std; class Test { public: Test(); ~Test(void); int id; int GetId(); };

C++ STL pair详解

一.解释: p { margin-bottom: 0.25cm; direction: ltr; color: #00000a; line-height: 120%; text-align: left; orphans: 2; widows: 2 } p.western { font-family: "Liberation Serif", serif; font-size: 12pt } p.cjk { font-family: "Noto Sans CJK SC Regul

智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr

RAII(Resource Acquisition Is Initialization) 资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放. 智能指针:用自动化或者说智能的指针来实现对动态内存的释放.它是一个类,有类似指针的功能. 常见的智能指针:auto_ptr/scoped_ptr/scoped_array/shared_ptr/shared_array,由于scoped_array和scoped_

C++ pair用法

 pair 默认对first升序,当first相同时对second升序: 类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类型,T2是第二个值的数据类型. 功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问. 具体用法: 1.定义(构造): 1 pair<int, double> p1; //使用默认构造函数 2 p

RFID Exploration and Spoofer a bipolar transistor, a pair of FETs, and a rectifying full-bridge followed by a loading FET

RFID Exploration Louis Yi, Mary Ruthven, Kevin O'Toole, & Jay Patterson What did you do? We made an Radio Frequency ID (RFID) card reader and, while attempting to create a long-range spoofer, created an jammer which overcomes card's signals. The read

智能指针 std::auto_ptr 和 shared_ptr

需要注意: auto_ptr 类可以用于管理由 new 分配的单个对象,但是无法管理动态分配的数组(我们通常不会使用数组,而是使用 vector 代替数组).auto_ptr 在拷贝和赋值的时候有不寻常的行为,因此 auto_ptrs 不能被保存在 stl 的容器中.当 auto_ptr 离开了自己的作用域或者被销毁,由 auto_ptr 管理的对象也会被销毁. 使用std::auto_ptr需要的头文件: #include <memory> // 示例 1(b): 安全代码, 使用了auto

pair

这个是非常经典的树分治的题目,关于60分的做法.参见poj1741 按照树分治的惯例,先全局统计,然后再减掉重复的东西. 那么如何计算贡献呢? 我们按照poj1741的方法.先将满足一维的情况的数据全部放入一个树状数组里面,然后我们就能够一维统计了. 复杂度O(nlog2n) 代码也比较凑合.... #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #includ