本章讲解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. UVA 10229 Modular Fibonacci

    斐波那契取MOD.利用矩阵快速幂取模 http://www.cnblogs.com/Commence/p/3976132.html 代码: #include <map> #include ...

  2. grep and regular expression --- ^ . *

    "^" : Start of Line anchor "." : Matches any single character except the newline ...

  3. linux内核分析之进程地址空间【转】

    转自:http://blog.csdn.net/bullbat/article/details/7106094 版权声明:本文为博主原创文章,未经博主允许不得转载. 本文主要介绍linux内核中进程地 ...

  4. [Oracle] oracle统计信息

    Oracle统计信息 Oracle数据库里的统计信息可以分为6种类型: 表的统计信息 索引的统计信息 列的统计信息 系统统计信息 数据字典统计信息 内部对象统计信息 图 1: Oracle统计信息 基 ...

  5. ios 最新系统bug与解决——微信公众号中弹出键盘再收起时,原虚拟键盘位点击事件无效

    最近ios发布新版本系统12.1,随着部分用户的系统更新,一些问题也渐渐暴露出来... 公司用户反映微信公众号出现了点击无效的bug!!测试调查发现,只有iphonex.iphone6,ihpone7 ...

  6. Starting MySQL... ERROR! The server quit without updating PID file 问题解决

    今天遇到一个mysql起不来,不知为啥挂了,启动是下面的报错 Starting MySQL... ERROR! The server quit without updating PID file 后来 ...

  7. AC日记——Roma and Poker codeforces 803e

    803E - Roma and Poker 思路: 赢或输或者平的序列: 赢和平的差的绝对值不得超过k: 结束时差的绝对值必须为k: 当“?”时可以自己决定为什么状态: 输出最终序列或者NO: dp( ...

  8. CF987C Three displays【一维DP/类似最大子序列和】

    [链接]:CF987C [分析]:先求出每个s[i]后面比s[i]大的c[i]的最小值,然后枚举前两个数c(i),c(j)以及 j 后面递增且存在最小值的dp(j) [代码]: #include< ...

  9. HDU 2546 饭卡【贪心+01背包】

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  10. nginx+tomcat负载使用

    Nginx+Tomcat搭建 版本 操作系统版本 Centos 6.4 Nginx版本 nginx-1.3.15.tar.gz JDK版本 jdk-7u71-linux-i586   //jdk1.7 ...