文章目录
- 一、异常处理机制
- (一)概念
- (二)语法格式
- (三)使用示例
- (四)异常处理机制库
- 二、模板
- (一)概念
- (二)函数模板
- 1. 语法格式
- 2. 函数模板的调用方式:
- (三)类模板
- 1. 语法格式:
- 2. 调用方式:显式调用并指定数据类型
- 3. 类内声明,类外实现:
- 三、容器库
- (一)vector容器--动态的连续的数组
- 1. 函数
- 2. 练习
- (二)迭代器
- 1. 概念
- 2. 语法格式
- 3. 使用示例
一、异常处理机制
(一)概念
程序中有一些错误或者是有一些异常需要处理。
异常处理机制本质上就是一个类;
(二)语法格式
//检测异常
try{
//抛出异常
throw -1;//后跟常量、变量、表达式
}
//处理异常
catch(int& e){//此处是个引用,数据类型与抛出异常保持一致,
//异常处理操作
cout<<"error="<<e<<endl;
}
- 注:
- throw语句要放在try语句块中
- try和catch之间不要放任何其他语句
- 抛出异常后,不会再继续执行下面的语句
(三)使用示例
eg:一组数据,指定输出这一组数据中的指定的数据
#include <iostream>
#include <string>
using namespace std;
int arr_data(int *arr,int len,int index){
if(index<0 || index>len-1){
throw -1;
}
return arr[index];
}
int main()
{
int arr[]={45,67,89,9,34,-23,91,24};
try{
cout<<"data="<<arr_data(arr,sizeof(arr)/sizeof(int),8)<<endl;
}catch(int &e){
cout<<"输入有误"<<endl;
}
return 0;
}
(四)异常处理机制库
在抛出异常时借助异常处理库
#include <iostream>
#include <string>
using namespace std;
int arr_data(int *arr,int len,int index){
if(index<0 || index>len-1){
throw out_of_range();
}
return arr[index];
}
int main()
{
int arr[]={45,67,89,9,34,-23,91,24};
try{
cout<<"data="<<arr_data(arr,sizeof(arr)/sizeof(int),8)<<endl;
}
//如果知道执行类型是什么类型就用什么类型,如果不知道,直接用标准异常处理库的父类即可
catch(exception &e){
//what()是标准异常库的公共接口
cout<<e.what()<<endl;
}
return 0;
}
二、模板
(一)概念
模板指的是泛型编程,即不考虑任何的数据类型,实现代码复用的一种方法
分类:函数模板和类模板
(二)函数模板
函数模板不是一个真正的函数
1. 语法格式
template <typename T1,typename T2>
返回值类型 函数名(T1 a,T2 b){}
- 注:
- typename表示是一个虚拟的数据类型,也可叫做虚拟类型
- 函数模板的本质上就是解决函数重载时,代码复用率不高的问题
- typename和class本质上没有什么区别,用哪一个都可以
- 函数模板和普通函数构成重载关系;
如果都存在的情况下,优先调用普通函数;
如果没有普通函数,才会调用函数模板
2. 函数模板的调用方式:
第一种方式:隐式调用
函数名(传递的参数);
//有普通函数时,普通函数比函数模板的优先级更高
第二种方式:显式调用(没有给出具体类型)
函数名<>(传递的参数);
//没有给具体的数据类型
第三种方式:显式调用(给出具体类型)
函数名<数据类型1,数据类型2>(传递的参数);
- 注:编译方式采用了二次编译
#include <iostream>
#include <string>
using namespace std;
template <typename T1>
T1 func(T1 a,T1 b){
return a+b;
}
int main()
{
cout<<"a+b="<<func(10,20)<<endl;
cout<<"a+b="<<func(10.5,20.3)<<endl;
return 0;
}
(三)类模板
1. 语法格式:
template <typename T1,typename T2,typename T3>
class 类名{
类型1 成员变量;
类型2 成员变量;
类型3 成员变量;
}
- 注:
- 对于类模板建议用typename,因为class关键字相同
- 类模板不是一个真正的类,不能进行实例化对象
2. 调用方式:显式调用并指定数据类型
类模板<具体数据类型>对象名(传递的实参);
使用示例
#include <iostream>
#include <string>
using namespace std;
template <typename T1,typename T2>
class MyClass{
public:
MyClass(){}
MyClass(T1 k,T2 v):key(k),value(v){}
~MyClass(){}
void show(){
cout<<key<<":"<<value<<endl;
}
private:
T1 key;
T2 value;
};
int main()
{
MyClass<string,int> l1("等级",6);
MyClass<string,string> l2("性别","男");
l1.show();
l2.show();
return 0;
}
3. 类内声明,类外实现:
- 注:类外实现,不仅要给student指定虚拟类型,还要把 “帽子” 加过来
三、容器库
(一)vector容器–动态的连续的数组
1. 函数
头文件:
#include <vector>
语法格式:
vector <数据类型> 容器对象; //定义vector容器未初始化
vector <数据类型> 容器对象={初始化列表};
常用的成员函数:
empty() :检查容器是否为空,空返回true,非空false
at(pos) :访问指定元素,同时进行越界检查;pos为下标,越界会返回std::out_of_range
push_back(value):尾插
pop_back() :尾删
clear() :清除所有元素
2. 练习
eg:从终端输入多个数字,直到-1停止,之后将输入的数据+10后输出
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> my_vector={};
int in=0;
while (1) {
cin>>in;
if(-1 == in)
break;
my_vector.push_back(in);
}
for(int i=0;i<my_vector.size();i++){
my_vector.at(i)+=10;
cout<<my_vector.at(i)<<" ";
}
cout<<endl;
return 0;
}
(二)迭代器
1. 概念
就是广义上的指针,跟指针很相似
每个容器都有自己的迭代器,定义在容器内部
迭代器就是遍历容器中数据的一种工具而已
2. 语法格式
vector<数据类型>::iterator 迭代器名;
- 注:easer擦除对象后,迭代器已经指向了下一个元素
3. 使用示例
eg: 输出以下图形:
代码实现:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//定义容器
vector<char> my_vector={};
//容器内传值
for(char i='A';i<='G';i++){
my_vector.push_back(i);
}
//定义迭代器
vector<char>::iterator my_iter=my_vector.begin();
int len=my_vector.size();
for(int i=0;i<len;i++){//行数
for(int j=0;j<my_vector.size();j++){//每行有几个
cout<<my_vector.at(j)<<" ";
}
my_vector.erase(my_iter);//擦除第一个
cout<<endl;
}
return 0;
}
输出结果: