本章讲解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. 动态符号链接的细节 与 linux程序的加载过程

    转: http://hi.baidu.com/clivestudio/item/4341015363058d3d32e0a952 值得玩味的一篇分析程序链接.装载.动态链接细节的好文档 导读: by ...

  2. aiohttp/asyncio 多次请求

    #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = "Daniel Altiparmak (sixfinger78@gmai ...

  3. 将打开的网页以html格式下载到本地

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. js5秒后自动关闭本页面及5秒钟后自动跳转指定页面的方法

    5秒钟后自动关闭 <!DOCTYPE HTML> <html> <head> <title>倒计时自动关闭/跳转页面</title> < ...

  5. 请求路径@PathVariable与请求参数@RequestParam的区别

    转自:http://www.iteye.com/problems/101566: http://localhost:8080/Springmvc/user/page.do?pageSize=3& ...

  6. Ionic 存储目录 CORS

    使用不同的存储库结构官方为 { "scripts": { "install": "cd path-to/your-app && npm ...

  7. Guava源码学习(三)ImmutableCollection

    基于版本:Guava 22.0 Wiki:Immutable collections 0. ImmutableCollection简介 类似于JDK的Collections.unmodifiableX ...

  8. Southern African 2001 框架折叠 (拓扑序列的应用)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398377.html 题目:考虑五个图片堆叠在一起,比如下面的9 * 8 的矩阵表示的是这些图片的边缘框. 现在上面的图片 ...

  9. [COCI2017-2018 Contest5] Birokracija

    题目描述 Mirko has become CEO of a huge corporation. This corporation consists of ​N people, labeled fro ...

  10. noip2017集训测试赛(十一)Problem C: 循环移位

    题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 ...