2023/9/14 -- C++/QT
作业:
仿照Vector实现MyVector,最主要实现二倍扩容
#include <iostream>using namespace std;template <typename T>
class MyVector
{
private:T *data;size_t size;size_t V_capacity;
public://无参构造MyVector():data(nullptr),size(0),V_capacity(0) {//cout<<"MyVector::无参构造"<<endl;}//有参构造MyVector(int count,T val){size = count;V_capacity = count;data = new T[count];for(int i = 0;i < count;i++){data[i] = val;}//cout<<"MyVector::有参构造"<<endl;}//析构函数~MyVector(){delete [] data;data = nullptr;//cout<<"MyVector::析构函数"<<endl;}// 定义迭代器类class MyIterator {private:T* ptr;public://有参构造MyIterator(T* p):ptr(p){//cout<<"MyIterator::有参构造"<<endl;}// *重载T& operator*()const {return *ptr;}// 前置++重载MyIterator& operator++() {++ptr;return *this;}// 后置++重载MyIterator operator++(int) {MyIterator temp = *this;++ptr;return temp;}// 前置--重载MyIterator& operator--() {--ptr;return *this;}// 后置--重载MyIterator operator--(int) {MyIterator temp = *this;--ptr;return temp;}// ==重载bool operator==(const MyIterator& other) const {return ptr == other.ptr;}// !=重载bool operator!=(const MyIterator& other) const {return ptr != other.ptr;}};//begin 函数 返回第一个元素的迭代器MyIterator begin() {return MyIterator(data);}//end 函数 返回最末元素的迭代器(注:实指向最末元素的下一个位置)MyIterator end() {return MyIterator(data + size);}//assign 函数 对MyVector中的元素赋值void assign(size_t num, const T &val ){for(int i = 0;i < num;i++){data[i] = val;}cout<<"assign 函数"<<endl;}//at 函数 返回指定位置的元素T at(int pos){if(pos < 0 || pos >= size){throw int(1); //抛出异常}return data[pos];}//back 函数 返回最末一个元素T& back(){return data[size-1];}//capacity 函数 返回vector所能容纳的元素数量size_t capacity(){return V_capacity;}//clear 函数 清空所有元素void clear(){size = 0;}//empty 函数 判空bool empty(){return size == 0;}//front 函数 返回第一个元素T& front(){return data[0];}//pop_back 函数 移除最后一个元素void pop_back(){if(empty()){throw int(2); //抛出异常}size--;}//push_back 函数 在MyVector最后添加一个元素void push_back(const T& value) {if (size == V_capacity) {// 扩容逻辑size_t newCapacity = (V_capacity == 0)?1:V_capacity * 2;T* newData = new T[newCapacity];for(int i = 0;i < static_cast<int>(size);i++){newData[i] = data[i];}delete[] data;data = newData;V_capacity = newCapacity;}data[size++] = value;}//size 函数 返回Vector元素数量的大小size_t get_size(){return size;}
};int main()
{MyVector<int> V1(5,2);cout<<"V1的第一个元素 = "<<V1.front()<<endl;cout<<"V1的最末一个元素 = "<<V1.back()<<endl;cout<<"V1的capacity = "<<V1.capacity()<<endl;cout<<endl;cout<<"********************************************************"<<endl;cout<<endl;V1.push_back(8);V1.push_back(5);V1.push_back(7);V1.push_back(6);cout<<"V1的第一个元素 = "<<V1.front()<<endl;cout<<"V1的最末一个元素 = "<<V1.back()<<endl;cout<<"V1的capacity = "<<V1.capacity()<<endl;cout<<"V1的size = "<<V1.get_size()<<endl;cout<<endl;cout<<"********************************************************"<<endl;cout<<endl;int *p = NULL;MyVector<int>::MyIterator q(p);cout<<"当前容器内的元素:";for(q = V1.begin();q != V1.end();q++){cout<< *q <<"\t";}cout<<endl;cout<<endl;cout<<"********************************************************"<<endl;cout<<endl;V1.pop_back();cout<<"V1的最末一个元素 = "<<V1.back()<<endl;V1.pop_back();cout<<"V1的最末一个元素 = "<<V1.back()<<endl;V1.pop_back();cout<<"V1的最末一个元素 = "<<V1.back()<<endl;cout<<"V1的size = "<<V1.get_size()<<endl;cout<<endl;cout<<"********************************************************"<<endl;cout<<endl;V1.clear();cout<<"V1的size = "<<V1.get_size()<<endl;return 0;
}
效果图:

一、异常处理
【1】异常概念
C++中的异常指的是在程序运行过程中出现的问题,没有任何语法错误,存在逻辑问题
【2】异常处理
- throw ----->抛出异常,抛出异常一定在异常发生之前
- try ····catch ----->捕获异常并进行异常处理
总结:
- 抛出异常一定在发生异常之前
- try···catch中可以存放所有可能发生异常的代码,只要有一条语句抛出异常,try后面的语句都不会执行
- 异常可以只有数据类型,也可以及有数据类型也有值
- catch可以通过数据类型,获取到异常的结果并使用if进行判断,如果每种异常抛出的都是不同的数据类型,catch中就无需定义变量
- 如果同种数据类型的异常有多个值,要依次根据值来判断异常的情况
- throw抛出异常往往被调函数的位置,try···catch往往在主调函数内处理异常
#include <iostream>
using namespace std;void fun(int a,int b)
{//throw 数据类型(值)//数据类型:指定抛出异常的类型,便于接收//值:针对不同的异常情况,给出不同的值,处理异常时使用//在执行语句之前先对可能发生异常的位置进行判断if(b==0){throw double(1);}if(b==3){//函数内抛出了两个double类型的异常,分别返回不同的值throw int(2);}if(b==2){throw double(2);}cout << a/b << endl;
}//处理异常一般在主函数内
//try···catch处理异常
int main()
{//tyr尝试接收异常,try内可以放多条语句,//有一条语句抛出异常后,后面都不会执行try{//try去接收所有可能的异常fun(4,2);fun(2,1);fun(3,3);}//由于函数中,只有一个double类型的异常,所以可以直接对异常的类型进行判断catch (double a) //如果double后面加变量名,变量会获取到异常的结果{if(a==1)cout << "除数为0" << endl;if(a==2)cout << "除数为2是一个测试" << endl;}catch (int){cout << "除数为3是一个测试" << endl;}fun(3,1);cout << "1" << endl;
}
二、using的第三种用法
#include <iostream>//using namespace std;
using std::string;
class A
{
public:string name;
};
class B:public A
{
protected:using A::name;
};
namespace P {string n1;
}//给命名空间重命名
//namespace 新的名字 = 旧的名字
//新名字和旧名字都能用
namespace O = P;
int main()
{using std::cout;using std::endl;typedef int a; //后面可以直接使用a定义int类型的变量//C++11支持的using INT = int; //后面可以直接使用INT定义int类型的变量INT num1 = 100;cout << num1 << endl;P::n1 = "helo";O::n1 = "hi";cout << O::n1 << endl;return 0;
}
三、类型转换
【1】隐式强转
以及和C中一致的显式强转
#include <iostream>
using namespace std;int main()
{float num1 = 2.3;int num2 = num1; //发生了隐式的强制类型转换//C中的显式强制类型转换double num3 = (double)num2;cout << num2 << endl;return 0;
}
【2】C++中支持的强制类型转换
- const_cast,取消常属性,取消常量指针的属性
- static_cast,和平时使用时发生强转用法一致,几乎支持所有类型间的强转
- dynamic_cast,发生在父子类指针间的转换,如果转换失败,会返回空地址
- reinterpret_cast,给类型重新赋值,不常用,不会检查数据类型匹配问题
#include <iostream>
using namespace std;class A
{string name;
public:virtual void show(){cout << name << endl;}
};class B:public A
{mutable int age;
public:void fun()const{age = 90;}void show(){cout << &age << endl;}
};int main()
{//定义了一个常量num1const int num1 = 90;int *p; //定义了一个指针变量p = const_cast<int *>(&num1); //使用const_cast让指针指向const修饰的变量的地址*p = 12;cout << *p << endl;//mutable关键也可以取消常属性//static_cast适用于几乎所有的强制类型转换char var = 'a';int num2;//int num2 = (int)var;num2 = static_cast<int>(var);cout << num2 << endl;A* p1 = new B; //父类指针指向子类的空间A* p2 = new A; //父类指针指向父类的空间//B* p3 = static_cast<B*>(p2); p2指向父类的空间,但是static_cast可以强转成功B* p3 = dynamic_cast<B*>(p2);//使用了dynamic_cast,可以实现多态情况下,可以实现父子类指针的转换//如果父类指针没有指向子类的空间,返回值为0cout << "父类指针指向父类的空间" << p2 << endl;cout << "子类的指针" << p3 << endl;B* p4 = reinterpret_cast<B*>(p2);cout << "父类指针指向父类的空间" << p2 << endl;cout << "子类的指针" << p4 << endl;char *str = "hello";int a = reinterpret_cast<int>(str);cout << a << endl;//p3->show();return 0;
}
四、lambda表达式
应用场合:
想要使用匿名的、临时的函数,并且还需要获取外部变量时
- lambda(λ)表达式,是C++11支持的
- lambda表达式,用于实现轻量级的匿名函数
- 定义:[]()mutable->返回值{函数体}; --->结果一般使用auto接收
[捕获列表](参数列表)mutable->返回值{函数体};
1、[=]:对所有变量按值捕获[&]:对所有变量按引用捕获[a,b]:对a和b按值捕获[&a,&b]:对a和b按引用捕获//[=,&a]:对除a外的变量值捕获,a按引用捕获//[&,a]:对除a外的变量按引用捕获,a按值捕获2、参数列表:和普通函数的参数一致,就是传参数到函数中
3、mutable可以写也可以不写:
如果不写mutable,在lambda表达式中不能修改按值捕获的变量的值,按引用捕获的不受影响
4、lambda实现的匿名函数的返回值
5、函数体就是匿名函数的实现
#include <iostream>
using namespace std;int main()
{int a = 90,b = 7,c,d,e;cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "--------------------" << endl;//使用lambda表达式,实现主函数内变量值的交换//[=]:对所有变量按值捕获//[&]:对所有变量按引用捕获//[a,b]:对a和b按值捕获//[&a,&b]:对a和b按引用捕获//[=,&a]:对除a外的变量值捕获,a按引用捕获//[&,a]:对除a外的变量按引用捕获,a按值捕获//lambda表示式,使用auto类型获取auto fun = [&,a]()mutable->void{ int temp;temp = a;a = b;b = temp;};fun();//使用lambda实现求最大值auto max = [=]()->int{ if(a>b)return a;elsereturn b; };cout << max() << endl;return 0;
}
五、STL标准模板库
C++ Standard Template Library
C++ 标准模板库(STL)
C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.
C++ STL 提供给程序员以下三类数据结构的实现:
- 顺序结构
- C++ Vectors
- C++ Lists
- C++ Double-Ended Queues
- 容器适配器
- C++ Stacks
- C++ Queues
- C++ Priority Queues
- 联合容器
- C++ Bitsets
- C++ Maps
- C++ Multimaps
- C++ Sets
- C++ Multisets
【1】Vector
Vector的底层实现,就是线性表
Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。
需要手动导入头文件#include
1、求vetcor容器的大小:
size_type capacity();
capacity() 函数 返回当前vector在重新进行内存分配以前所能容纳的元素数量.
2、添加元素
void push_back( const TYPE &val );
push_back()添加值为val的元素到当前vector末尾
3、求容器的真实大小
size_type size();
size() 函数返回当前vector所容纳元素的数目
4、给容器中的元素赋值
void assign( size_type num, const TYPE &val );
赋num个值为val的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
5、访问容器中的元素
TYPE at( size_type loc );
at() 函数 返回当前Vector指定位置loc的元素的引用. at() 函数 比 [] 运算符更加安全, 因为它不会让你去访问到Vector内越界的元素.
6、清空容器中的元素
void clear();
clear()函数删除当前vector中的所有元素.
7、判空函数
bool empty();
如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false.例如,以下代码清空一个vector,并按照逆序显示所有的元素:
8、返回起始位置的引用
TYPE front();
front()函数返回当前vector起始元素的引用
9、返回最后一个位置的引用
TYPE back();
back() 函数返回当前vector最末一个元素的引用.
10、返回起始元素的迭代器
iterator begin();
begin()函数返回一个指向当前vector起始元素的迭代器.
11、返回末尾下一个位置的迭代器
iterator end();
end() 函数返回一个指向当前vector末尾元素的下一位置的迭代器.
注意,如果你要访问末尾元素,需要先将此迭代器自减1.
12、指定位置的插入,由于没有提供返回指定位置迭代器,需要在第一个元素的迭代器上运算
iterator insert( iterator loc, const TYPE &val );
在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,
13、移除最后一个元素
void pop_back();
pop_back()函数删除当前vector最末的一个元素,
14、构造函数
vector( input_iterator start, input_iterator end );
迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).
【2】List
list的底层实现是一个双向链表
主要功能
1、头插
void push_front( const TYPE &val );
push_front()函数将val连接到链表的头部。
2、最大容量
size_type max_size();
max_size()函数返回链表能够储存的元素数目
3、元素个数
size_type size();
size()函数返回list中元素的数量。
4、排序
void sort();
给链表中的元素排序,默认是升序
5、判空
bool empty();
empty()函数返回真(true)如果链表为空,否则返回假。
相关文章:
2023/9/14 -- C++/QT
作业: 仿照Vector实现MyVector,最主要实现二倍扩容 #include <iostream>using namespace std;template <typename T> class MyVector { private:T *data;size_t size;size_t V_capacity; public://无参构造MyVector():data(nullptr),size(…...
golang在goland编译时获取环境变量失效
在golang中, 我们通常使用os包来获取环境变量,如: os.Getenv() os.LookupEnv() 等。 但如果我们使用goland编译器,在编译是,这时操作环境变量,会发现os包读取到的环境变量值不变: 新增后&am…...
一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了
一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了。 在互联网数据大爆炸的这几年,各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的…...
蓝桥杯 题库 简单 每日十题 day3
01 约数个数 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 1200000 有多少个约数(只计算正约数)。 解题思路 枚举,从1开始一直到1200000本身都作为1200000的除数,…...
基于SSM+Vue的高校实验室管理系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
C语言天花板——指针(初阶)
🌠🌠🌠 大家在刚刚接触C语言的时候就肯定听说过,指针的重要性以及难度等级,以至于经常“谈虎色变”,但是今天我来带大家走进指针的奇妙世界。🎇🎇🎇 一、什么是指针&…...
关于第一届全球电子纸创新应用金奖征集评选及报名指南
重要通知 |关于第一届全球电子纸创新应用金奖征集评选及报名指南https://mp.weixin.qq.com/s/RWsZtmJ20-NZXMG0k0rwPA?wxwork_useridEPIA 从2004年,Sony推出全球首款电纸书阅读器至今20载,这期间,到底诞生了多少种创新产品&#…...
idea搭建项目找不到Tomcat
idea搭建项目找不到Tomcat_idea没有tomcat配置项_ZYRL的博客-CSDN博客...
类和对象三大特性之继承
全文目录 继承的概念定义格式继承关系和访问限定符final 基类和派生类对象赋值转换继承中的作用域派生类的六个默认成员函数构造函数拷贝构造函数operator析构函数 友元和静态成员友元静态成员 各种继承形式菱形继承虚继承菱形虚拟继承对象模型 继承和组合 继承的概念 通过继承…...
Debian 12安装Docker
1.更新系统包 #apt update 2.安装依赖包 #apt install apt-transport-https ca-certificates curl gnupg lsb-release 3.添加Docker源 (1)添加Docker 官方GPG密钥 #curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/s…...
小谈设计模式(4)—单一职责原则
小谈设计模式(4)—单一职责原则 专栏介绍专栏地址专栏介绍 单一职责原则核心思想职责的划分单一变化原则高内聚性低耦合性核心总结 举例图书类(Book)用户类(User)图书管理类(Library)…...
ATF(TF-A) EL3 SPMC威胁模型-安全检测与评估
安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方FF-A ID 5.2 端点在直接请求/响应调用中模拟…...
AI绘画Stable Diffusion原理之扩散模型DDPM
前言 传送门: stable diffusion:Git|论文 stable-diffusion-webui:Git Google Colab Notebook部署stable-diffusion-webui:Git kaggle Notebook部署stable-diffusion-webui:Git AI绘画,输入一段…...
NSS [西湖论剑 2022]real_ez_node
NSS [西湖论剑 2022]real_ez_node 考点:ejs原型链污染、NodeJS 中 Unicode 字符损坏导致的 HTTP 拆分攻击。 开题。 附件start.sh。flag位置在根目录下/flag.txt app.js(这个没多大用) var createError require(http-errors); var express require(express); v…...
MySQL常用函数集锦 --- 字符串|数值|日期|流程函数总结
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、字符…...
GaussDB(DWS)云原生数仓技术解析:湖仓一体,体验与大数据互联互通
文章目录 前言一、关于数据仓库需求场景分类二、数据仓库线下部署场景2.1、线下部署场景介绍及优劣势说明2.2、线下部署场景对应的客户需求 三、数据仓库公有云部署场景3.1、公有云部署场景介绍及优劣势说明3.2、公有云部署场景对应的客户需求 四、为何重视数据共享(…...
Navicat历史版本下载及地址组成分析
下载地址组成 https://download3.navicat.com/download/navicat161_premium_cs_x64.exe 地址逻辑:前缀 版本 类型 语言 位数 前缀: http://download.navicat.com/download/navicat版本: 三位数,前两位是大版本,后一位是小版本ÿ…...
avue之动态切换表格样式问题
动态切换 a\b 两个表格 ,a表格高度变成b的高度等问题, 解决方案:...
彻底解决ruoyi分页后总数错误的问题
问题描述 最近时不时的发现用户列表出来的数据只有24条,但是总记录数却有58条,很奇怪。各种百度查询,都是什么修改查询分页改代码,尝试后发现还是没有效果,经过各种验证发现就是SQL语句错误。 如果非要说是SQL语句没…...
SpringMVC学习笔记——1
SpringMVC学习笔记——1 一、SpringMVC简介1.1、SpringMVC概述1.2、SpringMVC快速入门1.3、Controller中访问容器中的Bean1.4、SpringMVC关键组件的浅析 二、SpringMVC的请求处理2.1、请求映射路径配置2.2、请求数据的接收2.2.1、键值对方式接收数据2.2.2、封装JavaBean数据2.2…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
