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

news2024/12/23 18:35:15

文章目录

  • 一、异常处理机制
    • (一)概念
    • (二)语法格式
    • (三)使用示例
    • (四)异常处理库
  • 二、模板
    • (一)概念
    • (二)函数模板
    • (三)类模板
      • 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){
        cout<<e.what()<<endl;
    }
    return 0;
}

二、模板

(一)概念

模板指的是泛型编程,即不考虑任何的数据类型,实现代码复用的一种方法

分类:函数模板和类模板

(二)函数模板

函数模板不是一个真正的模板

函数模板的语法格式:

template <typename T1typename T2> 
返回值类型 函数名(T1 a,T2 b){}
  • 注:
  • typename表示是一个虚拟的数据类型,也可叫做虚拟类型
  • 函数模板的本质上就是解决函数重载时,代码复用率不高的问题
  • typename和class本质上没有什么区别,用哪一个都可以
  • 函数模板和普通函数构成重载关系;
    如果都存在的情况下,优先调用普通函数;
    如果没有普通函数,才会调用函数模板
  • 函数模板的调用方式:
    第一种方式:隐式调用
    函数名(传递的参数);//有普通函数时,普通函数比函数模板的优先级更高
    第二种方式:显式调用
    函数名<>(传递的参数);//没有给具体的数据类型
    第三种方式:显式调用
    函数名<数据类型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. 练习

#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. 语法格式


  • 注: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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生产者消费模式

前言&#x1f440;~ 上一章我们介绍设计模式中的单例模式&#xff0c;今天我们来讲讲生产者消费模式 阻塞队列&#xff08;重要&#xff09; 生产者消费模式&#xff08;重要&#xff09; 阻塞队列在生产者消费模型中的作用 标准库的阻塞队列 手动实现阻塞队列 如果各位对…

【python报错】已解决 ERROR: Could not find a version that satisfies the requirement

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 一、报错场景 在使用 pip 管理 Python 包时&#xff0c;您可能会遇到以下错误&#xff1a; ERROR: Could not find a version…

萌啦跨境工具箱有什么作用,萌啦跨境工具箱OZON营销神器

萌啦OZON数据平台&#xff0c;作为专为OZON平台商家打造的数据分析工具&#xff0c;集成了多种强大功能&#xff0c;旨在帮助商家在激烈的市场竞争中获得数据驱动的优势&#xff0c;实现精准运营与高效增长。那么萌啦跨境工具箱有什么作用&#xff1f;接下来介绍萌啦跨境工具箱…

opencv颜色识别,hsv采用滑块调节

识别效果如图所示&#xff0c;尽量排除了蓝色背景的干扰&#xff0c;hsv可用滑块进行调节&#xff0c;更加方便 import cv2 import numpy as np# 创建一个命名窗口&#xff0c;用于显示滑块 cv2.namedWindow("TrackBar")def nothing(x):pass# 创建滑块控件 cv2.cre…

对Transformer的一些理解

在学习Transformer这个模型前对seq2seq架构有个了解时很有必要的 先上图 输入和输出 首先理解模型时第一眼应该理解输入和输出最开始我就非常纠结 有一个Inputs&#xff0c;一个Outputs(shift right)和一个Output Probabilities&#xff0c;首先需要借助这三个输入/输出来初步…

UI自动化三之APP自动化

day06 能独立搭建app测试相关环境能通过命令在电脑端操作android系统中的应用&#xff08;adb命令&#xff09; day07 掌握appium基础操作api的使用&#xff08;安装、卸载、…&#xff09; 掌握appium高级api操作(拖拽、滑动、…) 掌握appium手机操作api&#xff08;按键…&am…

煤矿可视化:提升安全与效率

采用图扑先进的可视化技术&#xff0c;实时监控煤矿环境、设备运行和生产等数据。全方位展示与分析&#xff0c;有效提升安全管理水平和生产效率&#xff0c;助力煤矿智能化和高效运作。

基于正点原子FreeRTOS学习笔记——时间片调度实验

目录 一、时间片调度介绍 二、实验演示 1、宏修改 1.1、滴答定时器宏 1.2、调度器宏 2、实验程序 2.1.1、任务1&#xff0c;任务2不加临界区程序 2.1.2 实验现象 2.2.1、任务1&#xff0c;任务2加临界区程序 2.2.2 实验现象 一、时间片调度介绍 时间片&#xff1a;同…

仓储物流行业的好帮手-转运机器人

在物流行业快速发展的今天&#xff0c;一款高效、智能的转运机器人无疑是企业的得力助手。富唯智能转运机器人凭借其卓越的性能和智能化的特点&#xff0c;正成为越来越多企业的首选。 1、智能避障&#xff0c;安全无忧 富唯智能转运机器人采用无轨化激光SLAM导航技术&#x…

vue2 接口文档

const assetmanagementIndex (params) > getAction("/asset/assetmanagementsystem/page", params); //资产管理制度表分页列表 const assetmanagementPost (params) > postAction("/asset/assetmanagementsystem", params); //资产管理制度表新增…

BUG TypeError: GPT2Model.forward() got an unexpected keyword argument ‘past’

TypeError: GPT2Model.forward() got an unexpected keyword argument past’ 环境 transformers 4.38.1详情 这是由于新版的transformers 对GPT2Model.forward() 参数进行了改变导致的错误。具体是past名称改为了 past_key_values 。 解决方法 找到错误语…

2024广州国际米粉产业展览会暨米粉节

2024广州国际米粉产业展览会 时间&#xff1a;2024年11月16-18日 地点&#xff1a;广州中国进出口商品交易会展馆 主办单位&#xff1a;企阳国际会展集团 【展会简介】 米粉作为一种历史悠久&#xff0c;人们日常食用的食物&#xff0c;其市场需求稳定&#xff0c;且随着人…

深度探索“目录名称无效“:原因、解决方案与最佳实践

目录名称无效&#xff1a;现象背后的秘密 在日常使用电脑或移动设备时&#xff0c;我们时常会遇到“目录名称无效”的错误提示&#xff0c;这一提示仿佛是一道无形的屏障&#xff0c;阻断了我们与重要数据的联系。从本质上讲&#xff0c;“目录名称无效”意味着系统无法识别或…

Firewalld防火墙基础

Firewalld 支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具 支持IPv4、IPv6防火墙设置以及以太网桥 支持服务或应用程序直接添加防火墙规则接口 拥有两种配置模式 运行时配置&#xff1a;临时生效&#xff0c;一旦重启或者重载即不生效 永久配置&#xff1a…

产品设计的8大步骤

产品设计&#xff0c;通俗来说就是将创新想法或概念转化为落地实体的过程。一般来说&#xff0c;一个成功的产品应当具有创新性、美观性、实用性、可持续性以及经济效益&#xff0c;从而满足用户的使用需求以及市场的发展需求。产品设计也并不是一件简单的事情&#xff0c;产品…

AndroidStudio activity-1.8.0.aar依赖报错

在使用Androidstudio自帶的創建activity及配套 xml時&#xff0c;構建項目失敗&#xff0c;報錯内容&#xff1a; Null extracted folder for artifact: ResolvedArtifact(componentIdentifierandroidx.activity:activity:1.8.0, variantNamenull, artifactFileC:\Users\hhhh\.…

如何提高LLMs的文本表征(Text Embedding)能力?

目前&#xff0c;大模型落地的可靠方案还是以RAG&#xff08;retrieval-augmented-generation&#xff0c;检索增强生成&#xff09;为主&#xff0c;那么检索在大模型落地中就起着重要的作用。而稠密检索可以从语义层面找到与用户Query相关的文档片段&#xff0c;文本表征&…

C++:C与C++混合编程

混合编程 为什么需要混合编程 (1)C有很多优秀成熟项目和库&#xff0c;丢了可惜&#xff0c;重写没必要&#xff0c;C程序里要调用 (2)庞大项目划分后一部分适合用C&#xff0c;一部分适合用C (3)其他情况&#xff0c;如项目组一部分人习惯用C&#xff0c;一部分习惯用C 为什么…

FormLayout布局和FormItem对比

FormLayout布局和FormItem对比 FormLayout布局 package mainimport ("fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/layout""fyne.io/fyne/v2/widget" )func main() {myApp : app.…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…