C++ DAY7
一、类模板
建立一个通用的类,其类中的类型不确定,用一个虚拟类型替代
template<typename T>
类template ----->表示开始创建模板
typename -->表明后面的符号是数据类型,typename 也可以用class代替
T ----->表示数据类型,可以其他符号代替
使用类模板的时候,需要表明模板参数类型
#include <iostream>using namespace std;//声明创建类模板
template <typename T, typename N>
class A
{
private:T n;N b;
public:A(){}A(T n, N b):n(n),b(b){}void show(){cout << n << endl;cout << b << endl;}
};int main()
{A<string,int> a("zhangsan",1001);//使用类模板的时候,需要表明模板参数类型a.show();A<int, char> b(34,'w');b.show();return 0;
}
二、异常
更优雅的解决代码中的问题和异常,可以发现异常并处理进行分开
#include <iostream>using namespace std;int fun(int a, int b)
{if(b!=0){return a/b;}else{throw -1;}
}int main()
{try{fun(9,0); //把可能出现异常的代码用try包裹起来cout << "hello world" << endl;}catch(int e){if(e == -1){cout << "分母不能为0" << endl;}}return 0;
}
三、auto关键字
用来修饰变量,作为自动类型推导,推导出变量的数据类型
注意
1> 使用auto修饰变量时,必须初始化
2> auto的右值,可以是右值,也可以是表达式,还可以是函数的返回值
3> auto不能直接声明数组
4> auto不能作为函数的形参
5> auto不能修饰非静态成员
主要用于修饰冗长的数据类型,使用在函数模板中,依赖模板参数的变量。
四、lambda表达式
当你需要一个匿名的、临时的、需要获得外界变量的函数时,可以用lambda来完成。
#include <iostream>int main() {int a = 1, b = 2;// 值捕获auto sum1 = [a, b]() { return a + b; };std::cout << "sum1: " << sum1() << std::endl;// 引用捕获,由于是引用,出了作用域也会修改a、b值auto sum2 = [&a, &b]() { return a + b; };std::cout << "sum2: " << sum2() << std::endl;// 混合捕获auto sum3 = [a, &b]() { return a + b; };std::cout << "sum3: " << sum3() << std::endl;// 值捕获,但使用mutable使其可修改 出了作用域后不修改值auto sum4 = [a, b]() mutable { a = a + 1; return a + b; };std::cout << "sum4: " << sum4() << std::endl;// 指定返回类型auto sum5 = [a, b]() -> int { return a + b; };std::cout << "sum5: " << sum5() << std::endl;return 0;
}
五、数据库类型转换
1>隐式类型转换(自动类型转换)
这是C++编译器自动执行的类型转换,通常在表达式中出现时发生。例如,将较小的整数转换为较大的整数类型,将整数提升为浮点数等。
2>显示类型转换(强制类型转换)
通过使用强制类型转换操作符来显示执行类型转换。这种转换可能会导致数据的截断或者精度丢失,因此要小心使用。
(1)静态转换(static_cast)
用于基本数据类型之间的转换
以及父类指针/引用转换为子类指针/引用
还可以用于不同类型的指针之间的转换
double num_double = 3.14;
int num_int = static_cast<int>(num_double); // 显式将double转换为int
(2)动态转换(dynamic_cast)
通常用于多态类之间的指针或引用类型转换,确保类型安全。在运行时进行类型检查,只能用于具有虚函数的类之间的转换
class Base {virtual void foo() {}
};
class Derived : public Base {};Base* base_ptr = new Derived;
Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr); // 显式将基类指针转换为派生类指针
(3)常量转换(const_cast)
用于添加或移除指针或引用的常量性。它可以用来去除const限定符,但要注意潜在的未定义行为
const int a =10; //
int *p;
p = &a; // 合不合法? no//如果能这样使用,那就可以通过指针取值去改const修饰的值了,这就和const修饰相悖了
**************************************const int num_const = 5;
int* num_ptr = const_cast<int*>(&num_const); // 去除const限定符
(4)重新解释转换(reinterpret_cast)
执行低级别的位模式转换,通常用于指针之间的类型转换。它可能导致未定义行为,因此要谨慎使用
int num = 42;
float* float_ptr = reinterpret_cast<float*>(&num); // 重新解释转换
3>c风格类型转换
可以使用C样式转换
int num_int = 10;
double num_double = (double)num_int; // C样式强制类型转换
函数样式转换:C++中使用的类型转换
int num_int = 10;
double num_double = double(num_int); // C++函数样式类型转换
在使用强转的时候要注意潜在问题和错误,保证操作是安全的。
关键字总结

63个关键字,红色(不包括class,class是修改之前的错误)的32个是c中的关键字
1>
asm
1:这是一个用于嵌入汇编语言代码的关键字。它允许你在C++代码中直接插入汇编指令,通常用于执行特定的底层操作。然而,由于现代C++提供了更强大的抽象和跨平台性,通常不建议使用这个关键字。
explicit
2:这个关键字通常用于禁止隐式类型转换的发生。当一个构造函数被声明为explicit时,它将不会在隐式类型转换中被调用,只能在显式构造函数调用中使用。
export
3:在C++中,export关键字用于指示一个模板的定义将在另一个文件中实例化。然而,在实际的C++标准中,export关键字的语法并未最终确认,并且在许多编译器中也未被实现。在C++20中,export被重新引入,但是它的主要用途是与模块化编程相关,而不是之前模板实例化的用法。
goto
4:goto是一个跳转语句,允许你无条件地将程序的控制转移到指定的标签处。然而,由于使用goto会导致代码结构变得混乱和难以维护,现代编程实践通常建议避免使用它。
register
5:在早期的C语言标准中,register关键字用于建议编译器将变量存储在寄存器中,以便提高访问速度。然而,现代编译器已经能够智能地管理寄存器分配,所以使用register关键字通常不再有明显的性能提升,并且在C++17中已被弃用。
volatile
6:volatile关键字用于告诉编译器不要对标记为volatile的变量进行优化,因为这些变量的值可能会在未知的时间被外部因素改变,比如硬件中断或多线程环境中的共享变量。这可以防止编译器对这些变量的读取和写入操作进行优化,以确保程序的行为是可预测的。2> 数据类型相关的关键字
bool、true、false:对于bool类型数据的相关处理,值为true和false
char、wchar_t:char是单字符数据,wchar_t多字符数据
int、short、float、double、long:整数和实数的数据类型
signed、unsigned:定义有符号和无符号数据的说明符
auto:在c语言中,是存储类型,但是在C++中,是类型自动推导,注意事项有两个:
i> 连续定义多个变量时,初始值必须是相同数据类型,否则报错
ii> auto p=&m; 与auto* p = &m;规定是一样
explicit:防止数据隐式转换
typedef:类型重定义
sizeof:求数据类型的字节运算3> 语句相关的关键字
switch、case、default:实现多分支选择结构
do、while、for:循环相关的关键字
break、continue、goto:跳转语句
if、else:选择结构
inline:内联函数
return:函数返回值4> 存储类型相关的关键字
static、const、volatile、register、extern、auto5> 构造数据类型相关
struct、union:结构体和共用体
enum:枚举
class:类6> 访问权限:public、protected、private7> 异常处理:throw、try、catch8> 类中相关使用关键字
this:指代自己的指针
friend:友元
virtual:虚
delete、default:对类的特殊成员函数的相关使用
例如:Test(const Test &) = default; ~Test() = delete;
mutable:取消常属性
using:引入数据,有三种使用方式
i> 使用命名空间的关键字
ii> 相当于类型重定义
iii> 修改子类中从父类继承下来成员的权限
operator:运算符重载关键字9> 类型转换相关的关键字
static_cast、dynamic_cast、const_cast、reinterpret_cast10> 模板相关的关键字:template、typename11> 命名空间相关:using、namespace12> export:导入相关模板类使用13> 内存分配和回收:new、delete
六、C++标准模板库(STL)
标准模板库中使用了大量的函数模板和类模板,来对数据结构和算法的处理。
STL主要由 容器、算法、迭代器组成。
容器:置物之所也
数组、链表、队列、栈、集合。。。
算法:问题之解法也
增、删、改、查
迭代器:是容器和算法之间的粘合剂 (== 指针)
6.1vector
类似于数组、也可称之为单端数组
和普通数组的区别:普通数组是静态空间,vector是动态拓展。
动态拓展:不是在原来空间后续接空间,而是重新申请更大的空间,将原来的数据拷贝到新的空间中。
vector的构造函数
vector v;//无参构造
vector(v.begin(),v.end()); //将区间[begin(),end()),拷贝给本身
vector(const vector& v); //将v拷贝给本身
vector(n, elem) ; //将n个elem拷贝给本身
#include <iostream>
#include <vector>using namespace std;//算法
void printVector(vector<int> &v)
{vector<int>::iterator iter; //定义了这样容器类型的迭代器for(iter = v.begin(); iter != v.end(); iter++){cout << *iter << " ";}cout << endl;
}int main()
{//容器vector<int> v; //无参构造函数v.push_back(10); //尾插v.push_back(20);v.push_back(30);v.push_back(40);//算法printVector(v);vector<int> v2(v.begin(),v.end());printVector(v2);vector<int> v3(6,100);printVector(v3);vector<int> v4 = v3;printVector(v4);vector<int> v5(v2);printVector(v5);return 0;
}
vector的赋值函数
vector &operator = (const vector &v);//将v赋值给本身
assign(beg,end); //将区间[begin(),end())赋值给本身
assign(n, elem); //将n个elem赋值给本
vector容量大小
empty(); //判断容器是否为空
capacity() ; //计算容器的容量大小
size(); //计算容器大小 ---- 容器的元素个数
resize(); //重新设置大小
vector的插入和删除
push_back(); //尾插
pop_back(); //尾删
insert(iterator pos,elem) //在迭代器指向的位置,插入数据
insert(iterator pos,n, elem) //在迭代器指向的位置,插入n个数据
erase(iterator pos); //删除迭代器指向元素
erase(iterator start, iterator end); //删除区间的元素
clear() ; //删除容器中所有的元素
vector的元素提取
at(int idx);
operator[](int idx);
front(); //返回第一个元素
back(); //返回最后一个元素
七、文件操作
由于程序运行时的数据都是历史数据,程序一旦结束,数据就会消失
头文件: #include<fstream>
文件操作的三大类
读文件:ifstream
写文件:ofstream
读写:fstream
7.1写入数据
1.包含头文件
#include
2.创建流对象
ofstream ofs;
3.打开文件
ofs.open("文件名",打开方式);

4.写入数据
ofs
5.关闭文件
ofs.close();
7.2读文件
1.包含头文件
#include
2.创建流对象
ifstream ifs;
3.打开文件
ifs.open("文件名",打开方式);

试编程:
封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个)
再把该容器中的对象,保存到文件中。
再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
using namespace std;class Stu {
private:int classnum;int grade;string name;
public:Stu() {}Stu(int class_num, int grade, string name) : classnum(class_num), grade(grade), name(name) {}void set(int i, int g) {classnum = i;grade = g;}void name_set(string n) { name = n; }friend void ofs(vector<Stu>& p);
};void ofs(vector<Stu>& p) {ofstream ofs;ofs.open("F:/test.txt", ios::out);for (const auto& student : p) {ofs << student.classnum << ' ' << student.grade << ' ' << student.name << endl;}ofs.close();
}int main() {vector<Stu> p;for (int i = 0, j = 1; i < 2; i++, j++) {Stu student;student.set(i, j);if (0 == i) {student.name_set("lisi");} else if (1 == i) {student.name_set("zhangsan");}p.push_back(student);}ofs(p);return 0;
}
list相关函数
#include <iostream>
#include <list>int main() {// 默认构造函数std::list<int> lst1;// 初始化列表构造函数std::list<int> lst2 = {1, 2, 3};// 拷贝构造函数std::list<int> lst3(lst2);// 填充构造函数std::list<int> lst4(3, 10); // 3个元素,每个元素都是10// 赋值操作lst1 = lst2;// assign函数lst1.assign({4, 5, 6});lst2.assign(3, 7); // 3个元素,每个元素都是7// 输出lst1for (std::list<int>::iterator it = lst1.begin(); it != lst1.end(); ++it) {int x = *it;std::cout << x << ' ';}std::cout<<std::endl;// 输出lst2for (std::list<int>::iterator it = lst2.begin(); it != lst2.end(); ++it) {int x = *it;std::cout << x << ' ';}return 0;
}
相关文章:
C++ DAY7
一、类模板 建立一个通用的类,其类中的类型不确定,用一个虚拟类型替代 template<typename T> 类template ----->表示开始创建模板 typename -->表明后面的符号是数据类型,typename 也可以用class代替 T ----->表示数据类型…...
Vue2 使用插件 Volar 报错:<template v-for> key should be placed on the <template> tag.
目录 问题描述 版本描述 问题定位 问题解决 VS Code 插件地址 问题描述 在 VS Code 上使用插件 Volar 开发 Vue3 项目,然后去改 Vue2 项目时,对没有放在<template v-for> 元素上的 :key,会提示 <template v-for> key should…...
启动线程方法 start ()和 run ()有什么区别
在Java中,线程可以通过调用start()方法或者直接调用run()方法来执行。这两种方式有着重要的区别: start() 方法:当你调用线程的start()方法时,它会使线程进入就绪状态,等待系统调度。系统会为该线程分配资源,并在合适的时机执行线程的run()方法。实际上,start()方法会启…...
Java的全排列模板
c有全排列函数,我们Java没有,所以我们只能自己手写了。 模板一:(不去重) import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class liyunpeng {public static void main(Stri…...
读书笔记——《万物有灵》
前言 上一本书是《走出荒野》,太平洋步道女王提到了这本书《万物有灵》,她同样是看一点撕一点的阅读。我想,在她穿越山河森林,听见鸟鸣溪流的旅行过程中,是不是看这本描写动物有如何聪明的书——《万物有灵》…...
面试现场表现:展示你的编程能力和沟通技巧
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
34亿的mysql表如何优雅的扩字段长度兵并归档重建
业务背景: 该系统有一张表数据量已达到34亿,并且有个字段长度不够,导致很多数据无法插入。因为业务只要保留近2个月数据即可,所以需要接下来需要做2点:1,扩字段长度 2,只保留近2个月的数据。 …...
C#_进程单例模式.秒懂Mutex
什么是Mutex? 可以定义调用线程是否具有互斥性,程序创建者拥有控制权,相反只能引用程序。 参数1:如果是程序创建者,就获得控制权。 参数2:名称,可使用GUID生成。 参数3:out 返回值…...
AcWing 5050. 排序 (每日一题)
题目描述 给定一个长度为 n 的由小写字母构成的字符串。 请你按照 a∼z 的顺序,对字符串内的字符进行重新排序,并输出重新排序后的字符串。 输入格式 第一行包含整数 T ,表示共有 T 组测试数据。 每组数据第一行包含整数 n 。 第二行包…...
【TypeScript】proxy 和 Reflect
proxy (代理) 和 Reflect (反射) 参数一样。 基本用法 let person { name: xx, age: 20} // proxy 支持对象,数组,函数,set,map // 代理对象的常用模式:前面一个对象&…...
STM32f103入门(5)定时器中断
STM32 TIM(定时器/计数器)模块的中断流程如下: 配置TIM寄存器:首先,通过配置TIM相关的寄存器来设置计时器的基本参数,例如预分频系数、计数模式、计数器周期等。 使能TIM中断:使用TIM_ITConfig函…...
Mybatis查询数据
上一篇我们介绍了在pom文件中引入mybatis依赖,配置了mybatis配置文件,通过读取配置文件创建了会话工厂,使用会话工厂创建会话获取连接对象读取到了数据库的基本信息。 如果您需要对上面的内容进行了解,可以参考Mybatis引入与使用…...
【前车之鉴】: 2023最新教程-将java程序打包到maven私服的正确打开方式,详细流程介绍不怕你掌握不了
文章目录 为什么看这篇整体流程1. 注册账号【首次需要】2. 工单申请【新项目必须】3. 项目配置【新项目必须】4. 授权认证【新项目必须】5. 一键发布 最后也很重要 为什么看这篇 一是当前网络上一些博客有遗漏部分,这里做补充,二是网上思路没错ÿ…...
如何理解IaaS、PaaS、SaaS?盘点受欢迎的八大SaaS平台!
如何理解IaaS、PaaS、SaaS?他们各自的优势在哪里?我们又应该如何选择?本篇将带大家深入浅出的了解IaaS、PaaS、SaaS,并为大家盘点2023最受欢迎的SaaS平台。 通过本文你将了解: IaaS、PaaS、SaaS分别是什么我们该如何理…...
立创EDA专业版的原理图上器件有一个虚线框
立创EDA专业版的原理图上器件有一个虚线框解决方法 问题分析: 在使用立创EDA专业版 设计电路原理图时,中途莫名其妙就给我的元件添加了下面图片所示的虚线外框。看着就很别扭的样子,而且工程大了和器件稍微布局比较密的时候就导致整体很难看…...
JUC并发编程--------基础篇
一、多线程的相关知识 栈与栈帧 我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟 机就会为其分配一块栈内存。 每个栈由多个栈帧(Frame)组成…...
秒懂算法2
视频链接 : 希望下次秒懂的是算法题_哔哩哔哩_bilibili P1094 [NOIP2007 普及组] 纪念品分组 原题链接 : [NOIP2007 普及组] 纪念品分组 - 洛谷 思路 : 排序 贪心 双指针首先先对输入进来的数组进行排序(由小到大)运用贪心的思想 : 前后结合,令l1,rn,若a[l]a[r]<w…...
隐秘的角落:Java连接Oracle提示Connection timed out
前言 这个报错相信各位后端开发都不陌生,大体的原因就那么几种: 检查网络连接:确保您的计算机与数据库服务器之间的网络连接正常。尝试通过其他方式验证您的网络连接是否正常。 检查数据库服务器状态:确保数据库服务器正在运行&…...
基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic
摘 要 随着消费升级,越来越多的年轻人已经开始不再看重餐饮等行业的服务,而是追求一种轻松自在的用餐、购物环境。因此,无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…...
科技政策 | 四川省科学技术厅关于发布2024年第一批省级科技计划项目申报指南的通知
原创 | 文 BFT机器人 近日,四川省科学技术厅发布了2024年第一批省级科技计划项目申报指南;其中包括自然科学基金项目、重点研发计划、科技成果转移转化引导计划、科技创新基地(平台)和人才计划。 01 自然科学基金项目 实施周期 …...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
