C++编程(九)异常处理机制、模板、容器库

文章目录

  • 一、异常处理机制
    • (一)概念
    • (二)语法格式
    • (三)使用示例
    • (四)异常处理机制库
  • 二、模板
    • (一)概念
    • (二)函数模板
      • 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 T1typename 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;
}

输出结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/766618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zxing-cpp+OpenCV根据字符串生成条形码

编译构建 需要使用到 CMake、Git、GCC 或 MSVC。 github 链接&#xff1a;https://github.com/zxing-cpp/zxing-cpp 编译之前请确保&#xff1a; 确保安装了 CMake 版本 3.15 或更高版本。 确保安装了与 C17 兼容的编译器(最低VS 2019 16.8 / gcc 7 / clang 5)。 编译构建…

Linear Regression线性回归

目录 前言 Housing Price Prediction Linear Regression Loss/Cost Function Learning Rate 作业 前言 在本专栏中&#xff0c;我们将学习机器学习的知识。 Housing Price Prediction 在开始线性回归的研究之前&#xff0c;我们先来考虑一个实际的问题&#xff1a;房屋…

茗鹤APS高级计划排程系统,在集团多工厂协同生产下的应用

随着业务规模的扩大和市场的全球化&#xff0c;越来越多的企业选择“总部多工厂基地”的模式&#xff0c;此种模式大幅提升企业的产能与产量&#xff0c;有效分散风险。然后&#xff0c;与之而来的是对企业的管理提出更高的管理要求。多个生产基地不仅面临集团下发的周期性计划…

electron教程(一)创建项目

一、方式① 根据官网描述将electron/electron-quick-start项目克隆下来并启动 electron/electron-quick-start地址&#xff1a; GitHub - electron/electron-quick-start: Clone to try a simple Electron app git clone https://github.com/electron/electron-quick-start…

回溯 | Java | LeetCode 39, 40, 131 做题总结

Java Arrays.sort(数组) //排序 不讲究顺序的解答&#xff0c;都可以考虑一下排序是否可行。 39. 组合总和 错误解答 在写的时候需要注意&#xff0c;sum - candidates[i];很重要&#xff0c;也是回溯的一部分。 解答重复了。是因为回溯的for循环理解错了。 class Solutio…

JavaSE简易版扫雷小游戏

描述&#xff1a;用户输入二维雷区的高和宽&#xff0c;输入确定地雷数&#xff0c;随机在地雷区生成地雷。用户输入横竖坐标进行挖雷&#xff0c;挖到地雷游戏以失败结束&#xff0c;并让用户选择是否再次游戏&#xff1b;没挖到雷&#xff0c;显示该区域8个方向地雷数。如果8…

去中心化社会的崛起:探索区块链对社会结构的影响

随着区块链技术的发展和应用&#xff0c;我们正逐步迈向一个去中心化的社会结构。本文将深入探讨区块链技术如何影响社会结构&#xff0c;从经济、政治到文化等多个方面进行探索和分析&#xff0c;揭示其可能带来的革命性变革。 1. 区块链技术的基本原理回顾 1.1 分布式账本与…

放大器的输入电容Cin对放大电路的影响

1、OPA859构成的放大电路的设计 图中OPA859的增益G设定为1.16 &#xff0c;OPA859的增益带宽积GBP 900M , 放大器的带宽BW GBP / Acl 900 / 1.16 775.86M。 图&#xff1a;OPA859放大电路 由于需要在放大电路上加带宽的限制&#xff0c;所以在OPA859放大电路上有个低通限…

Elasticsearch基础(二):阿里云Elasticsearch快速入门

文章目录 阿里云Elasticsearch快速入门 一、资源领取 二、访问实例 三、创建索引 四、插入数据 五、搜索数据 1、全文搜索 2、按查询条件搜索 六、删除数据 阿里云Elasticsearch快速入门 一、资源领取 这里资源领取只针对新用户&#xff0c;如果是老用户按需购买&am…

vue3.0(十六)axios详解以及完整封装方法

文章目录 axios简介1. promise2. axios特性3. 安装4. 请求方法5. 请求方法别名6. 浏览器支持情况7. 并发请求 Axios的config的配置信息1.浏览器控制台相关的请求信息&#xff1a;2.配置方法3.默认配置4.配置的优先级5.axios请求响应结果 Axios的拦截器1.请求拦截2.响应拦截3.移…

太阳辐射系统日光全光谱模拟太阳光模拟器

太阳光模拟器是一种用于评估太阳能电池性能的重要设备。它能够模拟太阳光的特性&#xff0c;通过测试电池的短路电流、开路电压、填充因子和光电转化效率等关键指标&#xff0c;来评估电池的性能优劣。 设备型号&#xff1a;KYF-GC004品牌制造商&#xff1a;科迎法电气太阳光模…

bigNumber的部分使用方法与属性

场景&#xff1a;最近做IoT项目的时候碰到一个问题&#xff0c;涉及到双精度浮点型的数据范围的校验问题。业务上其实有三种类型&#xff1a;int、float和double类型三种。他们的范围分别是&#xff1a; //int int: [-2147483648, 2147483647],//float float: [-3402823466385…

idea xml ctrl+/ 注释格式不对齐

处理前 处理后 解决办法 取消这两个勾选

【C++题解】1456. 淘淘捡西瓜

问题&#xff1a;1456. 淘淘捡西瓜 类型&#xff1a;贪心 题目描述&#xff1a; 地上有一排西瓜&#xff0c;每个西瓜都有自己的重量。淘淘有一个包&#xff0c;包的容量是固定的&#xff0c;淘淘希望尽可能在包里装更多的西瓜&#xff08;当然要装整个的&#xff0c;不能切开…

Go语言--运算符

算术运算符 关系运算符 不能写0<a<10&#xff0c;要判断必须0<a&&a<10。因为int和bool不兼容 逻辑运算符 位运算符 赋值运算符 其他 运算符的优先级

数字化精益生产系统--RD研发管理系统

R&D研发管理系统是一种用于管理和监督科学研究和技术开发的软件系统&#xff0c;其设计和应用旨在提高企业研发活动的效率、质量和速度。以下是对R&D研发管理系统的功能设计&#xff1a;

Promethuse-监控 Etcd

一、思路 Prometheus监控Etcd集群&#xff0c;是没有对应的exporter&#xff0c;而 由CoreOS公司开发的Operator&#xff0c;用来扩展 Kubernetes API&#xff0c;特定的应用程序控制器&#xff0c;它用来创建、配置和管理复杂的有状态应用&#xff0c;如数据库、缓存和监控系…

PCL 点云最小图割(前景、背景点云提取)

点云最小图割 一、概述1.1 概念1.2 算法原理二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 概念 最小图割算法(pcl::MinCutSegmentation):是一种基于图论的对象分割方法,主要用于点云数据的处理和分析。该算法将点云数据表示为一个图结构,其中点云中的点作为图的节…

每日一题——Python实现PAT乙级1100 校庆(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度分析 空间复杂度分析 总结 我要更强 方法一…

中控室监控台在水处理行业的作用

随着工业化和城市化的快速推进&#xff0c;水处理行业的重要性日益凸显。作为确保水质安全、提高水资源利用效率的关键环节&#xff0c;水处理厂需要高效、稳定地运行。在这个过程中&#xff0c;中控室监控台发挥着不可或缺的作用。本文将从以下几个方面&#xff0c;详细阐述中…