本章讲解C++标准程序库中的通用工具。它们是由短小精干的类和函数构成。

Pairs(对组)

class pair可以将两个值视为一个单元。STL内多处使用了pair。尤其容器map和multimap,就是使用pairs来管理key/value的成对元素。

struct 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
pair():first(T1()),second(T2()) {} //constructor for two values
pair(cosnt 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) {}
};
//comparisons
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>&);
...
//convenience function to create a pair
template<class T1,class T2>
pair<T1,T2> make_pair(const T1&,const T2&);
}

make_pair()

template函数可以让你无需写出型别,就可以生成一个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);
}
}

因此我们可以这样使用make_pair()

std::make_pair(,'@')

而不必费力地这么写

std::pair<int,char>(,'@')

Class auto_ptr

auto_ptr是一种智能型指针(smart pointer),帮助程序员防止“被异常抛出时发生资源泄漏”。

auto_ptr是这样的一种指针:它是“它所指向的随想”的拥有者(owner)。所以,当身为对象拥有者的auto_ptr销毁时,该对象也将遭到销毁。auto_ptr要求一个对象只能有一个拥有者。

这个智能型指针应该保证,无论在何种情形下,只要自己被摧毁,就一定连带释放其所指资源。

auto_ptr拥有权的转移

auto_ptr的copy构造函数和assignment操作符负责将拥有权交出去。试看下例copy构造函数的运用:

std::auto_ptr<ClassA> ptr1(new ClassA);
std::auto_ptr<ClassA> ptr2(ptr1);

一开始ptr1拥有那个new出来的对象,在第二条语句中,拥有权由ptr1转交给ptr2.ptr2就拥有了那个new出来的对象,而ptr1不再拥有它。这样,对象就只会被delete一次--在ptr2被销毁的时候。

赋值动作也差不多

std::auto_ptr<ClassA> prt1(new ClassA);
std::auto_ptr<ClassA> ptr2;
ptr2=ptr1;

如果ptr2被赋值之前正拥有另一个对象,赋值动作发生时会调用delete,将该对象删除。

拥有权的转移,使得auto_ptr产生一种特殊用法:某个函数可以利用auto_ptr将拥有权转交给另一个函数。这种事情可以在两种情形下出现:

1.某函数是数据的终点。如果auto_ptr以by value方式呗当做一个参数传递给某函数。此时被调用端的参数获得了这个auto_ptr的拥有权,如果函数不再将它传递出去,它指向的对象就会在函数退出时被删除:

void sink(std::auto_ptr<ClassA>);

2.某函数是数据的起点。当一个auto_ptr被返回,其拥有权便转交给调用端

std::auto_ptr<ClassA> f()
{
std::auto_ptr<ClassA> ptr(new ClassA);
...
return ptr;
} void g()
{
std::auto_ptr<ClassA> p;
p=f();
}

数值极限(numeric Limits)

一般说来,数值型别的极值是一个与平台相关的特性。C++标准程序库通过template numeric_limits提供这些极值。

下面是numeric_limits<>的使用范例

#include <iostream>
#include <limits>
#include <string>
using namespace std; int main()
{
cout<<"max(short):"<<numeric_limits<short>::max()<<endl;
cout<<"max(int):"<<numeric_limits<int>::max()<<endl;
}

下表给出了class numeric_limits<>的所有成员

辅助函数

1.挑选较小值和较大值

namespace std{
template<class T>
inline const T& min(const T& a,const T& b) {return b < a ? b : a;}
template<class T>
inline const T& max(const T& a,const T& b) {return a < b ? b : a;}
}

上述两个函数还有另一个版本,接收一个额外的template参数作为“比较准则”:

namespace std{
template<class T,class Compare>
inline const T& min(const T& a,const T& b,Compared comp) {
return comp(b,a) ? b : a;
}
template<class T,class Compare>
inline const T& min(const T& a,const T& b,Compared comp) {
return comp(a,b) ? b : a;
}
}

下面这个例子示范了如何传入特定的比较函数作为操作,以此方式来运用max():

#include <algorithm>
using namespace std; bool int_ptr_less(int *a,int* b)
{
return *a < *b;
} int main()
{
int x=;
int y=;
int* px=&x;
int* py=&y;
pmax=max(px,py,int_ptr_less);
}

2.两值互换

函数swap()用来交换两对象的值。

namespace std{
template<class T>
inline void swap(T& a,T& b){
T tmp(a);
a=b;
b=tmp;
}
}

STL学习笔记(第四章 通用工具)的更多相关文章

  1. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  2. o'Reill的SVG精髓(第二版)学习笔记——第四章

    第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...

  3. Java 学习笔记 ------第四章 认识对象

    本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...

  4. 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透

    继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术     1.WEB应用渗透基础知识        先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...

  5. c语言学习笔记第四章——字符串和格式化输入、输出

    B站有视频演示 本章学习printf函数的输入输出,字符串的定义与实用. 字符串 字符串(character string)是一个或多个字符的序列,如下所示: "Zing went the ...

  6. [core java学习笔记][第四章对象与类]

    4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...

  7. C++标准程序库读书笔记-第四章通用工具

    1.Pairs(对组) (1)class pair可以将两个值视为一个单元.任何函数需返回两个值,也需要pair. (2)便捷地创建pair对象可以使用make_pair函数 std::make_pa ...

  8. The Road to learn React书籍学习笔记(第四章)

    高级React组件 本章将重点介绍高级 React 组件的实现.我们将了解什么是高阶组件以及如何实现它们.此外,我们还将深入探讨 React 中更高级的主题,并用它实现复杂的交互功能. 引用 DOM ...

  9. STL学习笔记(第二章 C++及其标准程序库简介)

    本章重点是介绍与C++标准程序库相关的几个最重要的语言新特性 template(模板) 程序库中几乎所有东西都被设计成template形式.所谓templates,是针对“一个或多个尚未明确的型别”所 ...

  10. 【数据分析 R语言实战】学习笔记 第四章 数据的图形描述

    4.1 R绘图概述 以下两个函数,可以分别展示二维,三维图形的示例: >demo(graphics) >demo(persp) R提供了多种绘图相关的命令,可分成三类: 高级绘图命令:在图 ...

随机推荐

  1. (计数器)NOIP模拟赛(神奇的数位DP题。。)

    没有原题传送门.. 手打原题QAQ [问题描述]     一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...

  2. Windows下VS2013创建与使用动态链接库(.dll)

    一.创建动态链接库文件 ** 1.打开VS2013,选择文件,新建工程  2.选择新建W32控制台应用程序,这里将工程名改为makeDLL  3.在应用程序类型中选择DLL,点击完成  4.完成以上步 ...

  3. centos6.5 网卡服务开机自动启动

    今天打开许久没用的centos之后,发现网络服务器不可用,通过service network restart 依然无法使用,简单记录一下处理过程: 1.通过setup 命令查看Network conf ...

  4. javascript原型理解一种

    http://www.jianshu.com/p/15ac7393bc1f 这个系列值得好好学习的.. // 声明构造函数 function Person(name, age) { this.name ...

  5. AC日记——Two poj 1849

    Two 思路: 树形DP求直径: 答案是边权总和*2-直径: dp[i][1]::以i为根的子树中最长的路径: dp[i][0]::以i为根的子树中次长的路径: 来,上代码: #include < ...

  6. Netty源码学习(七)FastThreadLocal

    0. FastThreadLocal简介 如同注释中所说:A special variant of ThreadLocal that yields higher access performance ...

  7. 陕西师范大学第七届程序设计竞赛网络同步赛 F WWX的礼物【数学/k进制下x^n的位数/log】

    链接:https://www.nowcoder.com/acm/contest/121/F来源:牛客网 题目描述 WWX的女朋友送给了他一个礼物,可是礼物却被一把K进制密码锁锁住了.在礼物盒上还有一张 ...

  8. 2017 China Collegiate Programming Contest Final (CCPC 2017)

    题解右转队伍wiki https://acm.ecnu.edu.cn/wiki/index.php?title=2017_China_Collegiate_Programming_Contest_Fi ...

  9. [51Nod1487]占领资源

    题目大意:​ 有一个$n\times m(x,m\leq 100)$的网格图,每个格子有一个权值$w_{i,j}(1\leq w_{i,j}\leq 9)$.你可以在图中选两个格子,每个格子$(x,y ...

  10. String中的方法

    1.string s1 = "abcdefghij";   string s2 = "kuo";   Console.WriteLine(s1.Clone()) ...