摘要:
//第二十三模板 18.4算法类/*STL(标准模板库)通用算法共分四大类不变序列算法 不对其所作用的容器进行修改改变序列算法 对其所作用的容器进行修改排序算法 对容器中的元素采用多种方式进行排序数值算法 对容器中的元素进行数值计算这些算法全部在标准命名空间std中的<algorithm>中定义*///1 函数对像//要理解这些标准算法是如何工作的,我们必须了解函数对象的,函数对像即定义的重载运算符()/*#include <iostream>using namespace std;template<class T>class show{public: .. 阅读全文
摘要:
//第二十三模板 18.5数值算法//STL的数值算法可以对一个序列的元素进行四种计算,接下来将逐步讲述这四种计算方法//(1)accumulate(first,last,init)/*#include <iostream>#include <algorithm>#include <vector>#include <numeric>using namespace std;void show(int val){ cout<<val<<endl;}int main(){ vector<int>one; for(in 阅读全文
摘要:
//第二十三模板 18.3.3 多重映射 multimaps//多重映射Multimaps和maps映射很相似,但是MultiMaps允许重复的关键字,这使得nultimap在某些情下会更有用,比如说在电话簿中同一个人可以多个电话号码//1 插入元素//multimap模板类的insert方法为我们解决了插入的难题//2 查找第一个与关键字相关联的值//与map类似, multimap具备两个版本重载的find()成员函数//3查找多个与同一个关键字相关联的值//假如我们想要获得multimap容器中所有与要查找的关键字相关联的值,可以使用equal_range()函数//pair equal 阅读全文
摘要:
//第二十三模板 18.3.4多重集合 multiset//多重集合(Multisets)和集合(sets)相似,只不过前者支持有重复元素,也就是说可以允许多个同一个元素的集合/*#include <iostream>#include <set>#include <string>using namespace std;int main(){ multiset<string>one; one.insert("陈群"); one.insert("陈群"); multiset<string>::con 阅读全文
摘要:
//第二十三模板 18.3.5 位集合//Bitsets给程序员提供一种位集合的数据结构,这种位集合的通二进制的因此Bitsets提供了许多位操作符,比如!= == &= ^= |= ~ <<= >>= []//1 Bitsets的创建/*#include <iostream>#include <bitset>using namespace std;int main(){ bitset<8>bs( (long)131 ); for(int i=(int)bs.size()-1; i>=0; i--) { cout< 阅读全文
摘要:
//第二十三模板 18.2列表容器//列表容器list是个标准模板库容器类/*#include <iostream>#include <list>using namespace std;typedef list<int> List;int main(){ List ll; List::iterator p; //list类的迭代器方法iterator,并声明了一个迭代器p,可以将其看作是一个归一化的指针 //也可锦成List::const_iterator p; //const_iterator p表示迭代器p指向的是一个常量,它的值是不可修改的 for(i 阅读全文
摘要:
//第二十三模板 18.3关联容器/*顺序容器可使用下标或者迭代器对元素进行顺序或者随机访问,但是不能使用关键值对关键元素进访问关联容器弥补了这个缺点,关联容器可以使用关键字对关键元素进行访问标准C++库提供了四个关联容器,映射 多重映射 集合和多重集合*///1映射//标准映射容器类maps要关联容器的一种/*begin() 返因指向map头部的迭代器clear() 删除所有元素count() 返回指定元素出现的次数empty() 如果map为空由返回trueend() 返回指向map末尾的迭代器equal_range()返回特殊条目的迭代器对erase()... 阅读全文
摘要:
//第二十三模板 17静态成员和模板/*#include <iostream>using namespace std;template<class T>class num{public: num():x(0){} T get(){ return y;}private: T x; static T y; //声明了一个静态成员y,它的类型是T,这个静态成员y在下面进行了初始化为0 //注意,于它是模板类的静态成员,因此在初始化之前,要列出模板类所用的模板};template <class T>T num<T>::y=1;int main(){ nu 阅读全文
摘要:
//第二十三模板 18标准模板库//1 容器 容器是包含其他对像的对像,标准C++ 库中提供了一系列的容器类//可以分为两种类型,顺序和关联类型,顺序容器可提供对自身元素的顺序或者随机访问,关联容器则过滤掉了一些元素,只按关键值访问有关元素//2 顺序容器//标准C++库提供了三种顺序容器,分别为vector list 和deque//2.1 向量容器/*#include <iostream>#include <vector>#include <string>using namespace std;const int num=2;int main(){ ve 阅读全文
摘要:
//第二十三模板 15模和友元//模板类也可以声明为友元,模板类的友元共分三种情况//1 非模板友元类或者友元函数//2 通用模板类或者友元函数//3 特定类型的模板友元类或者友元函数//1非模板的友元类和友元函数//我们可以将任何类或者函数声明为模板类的友元,这样由模板类生成的每个具体类都会正确处理友元类或者友元函数,就好像友元关系已经在具体化的类中声明了一样/*#include <iostream>using namespace std;const int size=10;template<class T>class num{public: num(int Tsiz 阅读全文
摘要:
//第二十三模板 16多余的临时对像//未具体化num模板类构造函数/*#include <iostream>using namespace std;const int size=2;class people{public: people(int); people(); ~people(); int GetAge()const{ return age;} void SetAge(int the){ age = the;} people &operator=(const people&r){ cout<<"调用people类的operator=函 阅读全文
摘要:
//第二十三模板 11模板参数提供默认值/*#include <iostream>#include <string>using namespace std;//默认参数 class T2=inttemplate<class T1, class T2=int>class People{public: T1 &getx(); T2 &gety(); T1 getx()const{ return x;} T2 gety()const{ return y;} People(const T1&a, const T2&b):x(a),y( 阅读全文
摘要:
//第二十三模板 12约束模板//结束模板的大意,即是对模板的数据和方法有要求/*template<class T>T max(T a, T b){ return (a>b)?a:b;}假如比较的类型是两个指向字符串的指针,则比较运算符>比较的是两个地址而不是数值char* max(char *a, char *b){ if(strcmp(a,b) > 0) return a; else return b;}该函数具体化了max函数的两个参数和功能,该函数的两个参数是char*,它的功能是使用strcmp函数比较指针所指向的字符串而不是指针,这个特定的用来替换函数 阅读全文
摘要:
//第二十三模板 13模板成员//模板可作为类,结构甚至模板类的成员/*#include <iostream>using namespace std;template<class T1>class One{public: //不知道这里的i是什么意思 //One(T1 t, int i):first(t),second(t){} One(T1 t, int i):first(t),second(i){} template<class T2> T2 get(T2 t2, T1 t1){ cout<<"second.get()返回" 阅读全文
摘要:
//第二十三模板 14将模板用作参数//模板除了可以包括类型参数(class T)和非类型参数(int n)之外,还要台将模板作为参数包括进去//tempalte<calss T>//template<template<class T>class T1>//这个T1类型有局限性,它要求我们在使用该模板时传递的参数必须是个模板类//people<human>Jack;//其中的human是用a模板声明的模板类,而people则是用b模板声明的模板类, Jack是用people这个模板类定义的一个对像/*#include <iostream&g 阅读全文
摘要:
//第二十三模板 8数组模板/*#include <iostream>using namespace std;template<class T, int n>class people{public: people(); people(const T&t); T&operator[](int i); //注意: //这两行定义的带一个参数的构造数和下标运算符数operator[],它们操作的对像不是下面定义的数组成员a[] //而是people类的对像 void show();private: T a[n];};template<class T, i 阅读全文
摘要:
//第二十三模板 9对像数组模板//我们也可以直接使用对像模板来构造对像数组//people<people<int,5>,10>two;//该语句创建了一个包含10个元素对像数组two,每个对像又拥有一个包含5个int元素的数组,因此它可以看作如下二维数组//int two[10][5]//注意,在模板的表示语法中,维的顺序与正常的二维数组的顺序相反//people<people<int,5>,10>one; 可看做是 one[10][5];/*#include <iostream>using namespace std;templa 阅读全文
摘要:
//第二十三模板 10具有多个参数的模板/*#include <iostream>#include <string>using namespace std;template<class T1, class T2>class People{public: T1 &getx(); T2 &gety(); T1 getx()const{ return x;} T2 gety()const{ return y;} People(const T1&a, const T2&b):x(a),y(b){ cout<<"构 阅读全文
摘要:
//第二十三模板 4普通函数,函数模板与具体化函数模板的优先级//我们定义了个普通函数,然后又定义了一个该函数的模板,接着又重载了这个函数的模板,那么这里就存在一个优先级的问题,即先调用哪里个函数//1 普通函数和函数模板的执行次序/*#include <iostream>using namespace std;template <class T>void show(T a){cout<<"模板函数"<<endl;}void show(int a){cout<<"普通函数"<<end 阅读全文
摘要:
//第二十三模板 5函数模板的匹配/*#include <iostream>using namespace std;struct people{ char name[10]; int age;};template <class T>void show(T t[], int n){ cout<<"执行函数模板void show(T t[], int n) "<<endl; for(int i=0; i<n; i++) cout<<t[i]<<' '; cout<<endl 阅读全文