C++(学习)2024.9.24

目录

容器

1.标准模板库STL

2.概念

3.顺序容器

(1)array数组

(2)vector向量

(3)list列表

(4)deque 队列

4.关联容器

5.迭代器

面向对象核心

继承

概念

构造函数

1.派生类与基类构造函数的关系

2.解决方案

(1)补充基类的无参构造函数

(2)手动在派生类中调用基类构造函数

1.透传构造


容器

1.标准模板库STL

标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。虽说它主要出现到了C++中,但是在被引入C++之前该技术就已经存在了很长时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

2.概念

容器是用来存储数据的集合,数据元素可以是任何类型(因为是使用模板实现)。
容器类的使用,都要引入对应的头文件。

3.顺序容器

顺序容器中每个元素都有固定的位置并呈线性排布,除非使用删除或者插入的操作改变元素的位置。

(1)array数组

array是C++11新增的容器类型,与传统数组相比更加的安全、易于使用。array数组是定长的。没有办法方便的进行伸缩。

#include <iostream>
#include <array>
using namespace std;int main()
{// 创建一个长度为5的int数组array<int,5> arr = {1,2,3}; // 后面两位补零cout << arr[0] << endl; // 1cout << arr[4] << endl; // 0cout << arr.at(2) << endl;  // 3arr[3] = 200;arr[4] = 300;for(int i = 0; i < arr.size(); i++){cout << arr.at(i) << " ";}cout << endl;// for eachfor(int i : arr){cout << i << endl;}return 0;
}

(2)vector向量

        vector内部是由数组实现的,比较适合进行随机的存取操作,而不擅长插入删除操作。不是定长的

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> vec(5);     // 创建一个长度为5的int向量cout<<vec.size()<<endl;     // 5// 增// 向后追加单元素vec.push_back(111);cout<<vec.size()<<endl;     // 6vec.insert(vec.begin()+1,666);// begin()可以返回指向第一个元素的迭代器指针,+1是在第二个位置上插入333//改vec.at(0)=777;vec[2]=555;vec.at(3)=444;vec.at(4)=333;vec.at(5)=222;for(int i:vec){cout<<i<<" ";}cout<<endl;// 删除// 删除最后一个元素vec.pop_back();for(int i:vec){cout<<i<<" ";}cout<<endl;vec.erase(vec.begin()+1);//删除第二个元素vec.erase(vec.end()-2);//删除倒数第二个元素for(int i:vec){cout<<i<<" ";}cout<<endl;//查cout<<"vec[0]="<<vec.at(0)<<endl;cout<<"vec[1]="<<vec[1]<<endl;for(size_t i=0;i<vec.size();i++){cout<<vec.at(i)<<" ";}cout<<endl;//判断是否为空,0:非空   1:空cout<<vec.empty()<<endl;vec.clear();cout<<vec.empty()<<endl;return 0;
}

(3)list列表

        list内部是由双向链表实现,内存空间不连续,不支持下标。优点:可以高效的删除和插入操作,但是不适合随机的存取。

#include <iostream>
#include <list>
using namespace std;int main()
{//    list<string>  lis1;//    list<string>  lis2={"hello","world"};// 创建一个长度为5的列表,每个元素都是hellolist<string> lis(5,"hello");for(string i:lis){cout<<i<<" ";}cout<<endl;// 增lis.push_back("world");// 向后追加单元素lis.push_front("heiheihei");// 向前追加单元素lis.insert(++lis.begin(),"111");// 在第二个位置上插入"111"for(string i:lis){cout<<i<<" ";}cout<<endl;//删除lis.pop_back();// 删除最后一个元素lis.pop_front();  // 删除第一个元素for(string i:lis){cout<<i<<" ";}cout<<endl;list<string>::iterator iter=lis.begin();// 保存迭代器指针advance(iter,1); // 移动迭代器指针到固定位置lis.insert(iter,"222");for(string i:lis){cout<<i<<" ";}cout<<endl;// 删除最后一个元素//    iter=lis.end();//    iter--;//    lis.erase(iter);iter=lis.begin();advance(iter,1);lis.erase(iter);for(string i:lis){cout<<i<<" ";}cout<<endl;// 返回第一个元素的引用cout << lis.front() << endl;// 返回最后一个元素的引用cout << lis.back() << endl;//改iter=lis.end();advance(iter,2);*iter="200";for(string i:lis){cout<<i<<" ";}cout<<endl;//查cout<<"iter="<<*iter<<endl;// 不能使用普通循环遍历,因为不支持下标// 清空lis.clear();cout << lis.size() << endl; // 0return 0;
}

(4)deque 队列

        deque几乎支持所有vector的API,性能位于vector与list两者之间,是最擅长两端存取的顺序容器。

#include <iostream>
#include <deque>
using namespace std;int main()
{deque<int> deq(5);     // 创建一个长度为5的int队列cout<<deq.size()<<endl;     // 5// 增// 向后追加单元素deq.push_back(111);cout<<deq.size()<<endl;     // 6deq.insert(deq.begin()+1,666);// begin()可以返回指向第一个元素的迭代器指针,+1是在第二个位置上插入333//改deq.at(0)=777;deq[2]=555;deq.at(3)=444;deq.at(4)=333;deq.at(5)=222;for(int i:deq){cout<<i<<" ";}cout<<endl;// 删除// 删除最后一个元素deq.pop_back();for(int i:deq){cout<<i<<" ";}cout<<endl;deq.erase(deq.begin()+1);//删除第二个元素deq.erase(deq.end()-2);//删除倒数第二个元素for(int i:deq){cout<<i<<" ";}cout<<endl;//查cout<<"deq[0]="<<deq.at(0)<<endl;cout<<"deq[1]="<<deq[1]<<endl;for(size_t i=0;i<deq.size();i++){cout<<deq.at(i)<<" ";}cout<<endl;//判断是否为空,0:非空   1:空cout<<deq.empty()<<endl;deq.clear();cout<<deq.empty()<<endl;return 0;
}

4.关联容器

关联容器的各个元素之间没有严格顺序,虽然内部具有排序特点,但是在使用时没有任何顺序相关接口。最常见的关联容器就是map-键值对映射。

         对于map而言,键具有唯一性,通常使用字符串类型,值可以是任何类型。通过键可以找到对应的值。

#include <iostream>
#include <map>
using namespace std;int main()
{//列表初始化map<string,int> ma1={{"身高",185},{"年龄",22}};//有两个元素cout<<ma1.size()<<endl;     //2//创建一个元素数据为0的键值对对象map<string,int> ma;cout<<ma.size()<<endl;      //0//增ma["身高"]=180;ma.insert(pair<string,int>("体重",120 ));//查cout<<ma["身高"]<<endl;       //180cout<<ma["体重"]<<endl;       //120//改ma["身高"]=175;cout<<ma["身高"]<<endl;       //175//删int re=ma.erase("身高");cout<<"身高删除 "<<re<<endl;        //身高删除 1cout << ma.size() << endl;      //1re = ma.erase("学号");cout << re << endl;     //0if(ma.find("身高")==ma.end()){cout<<"没有找到身高元素"<<endl;}else{cout<<ma["身高"]<<endl;}ma.clear();cout<<ma.size()<<endl;      //0return 0;
}

5.迭代器

迭代器是一个特殊的指针,主要用于容器的元素读写以及遍历。
如果迭代器不进行修改操作,仅以使用只读迭代器,const_iterator,反之则使用iterator。

#include <iostream>
#include <map>
#include <array>
#include <vector>
#include <list>
#include <deque>using namespace std;int main()
{string s="abcd";cout<<"迭代器遍历string"<<endl;for(string::const_iterator iter=s.begin();iter!=s.end();iter++){cout<<*iter<<" ";}cout<<endl;cout << "--------------" <<endl;array<int,5> arr={1,2,3,4,5};cout<<"迭代器遍历array"<<endl;for(array<int,5>::const_iterator iter=arr.begin();iter!=arr.end();iter++){cout<<*iter<<" ";}cout<<endl;cout << "--------------" <<endl;vector<string> vec(6,"hello");cout<<"迭代器遍历vector"<<endl;for(vector<string>::const_iterator iter = vec.begin();iter != vec.end();iter++){cout<<*iter<<" ";}cout<<endl;cout << "--------------" <<endl;list<string>lis(6,"world");cout<<" 迭代器遍历list"<<endl;for(list<string>::const_iterator iter = lis.begin();iter != lis.end();iter++){cout<<*iter<<" ";}cout<<endl;cout << "--------------" <<endl;deque<string> de(6,"haha");cout<<"迭代器遍历deque"<<endl;for(deque<string>::iterator iter = de.begin(); iter != de.end(); ++iter){cout<<*iter<<" ";}cout<<endl;cout << "--------------" <<endl;map<string,int>ma;ma["年龄"] = 22;ma["身高"] = 175;ma["体重"] = 60;cout<<"迭代器遍历map"<<endl;for(map<string,int>::const_iterator iter = ma.begin();iter != ma.end();iter++){                       // first 是键,second 是值cout << iter->first << " " << iter->second << endl;}return 0;
}

面向对象核心

继承

概念

继承就是面向对象的三大特性之一,体现了代码复用的思想。
继承就是在一个已存在的类的基础上,建立一个新的类,并拥有其特性。
1.已存在的类被称为“基类”或者“父类”
2.新建立的类被称为“派生类”或者“子类”

#include <iostream>
using namespace std;// 基类
class Father
{
private:string name = "张";
public:void set_name(string name){this->name = name;}string get_name(){return name;}void work(){cout << "我的工作是厨师,我负责炒菜" << endl;}
};// 派生类
class Son:public Father
{
};int main()
{Son son;cout << son.get_name() << endl;son.work();return 0;
}

上面的代码,Son类的功能几乎与Father类重叠,在实际的使用过程中,派生类会做出一些与基类的差异化。
●修改继承来的基类内容
属性:

1、公有属性可以直接更改。更改后基类中的属性也会改变,因为改的是同一份变量        

2、私有属性,需要使用基类公有函数进行更改。
行为:函数隐藏,通过派生类实现一个同名同参数的函数,来隐藏基类的函数。
●新增派生类的内容

#include <iostream>
using namespace std;// 基类
class Father
{
private:string name = "张";
public:void set_name(string name){this->name = name;}string get_name(){return name;}void work(){cout << "我的工作是厨师,我负责炒菜" << endl;}
};// 派生类
class Son:public Father
{
public:void init(){set_name("王");}void work(){cout << "我的工作是司机" << endl;}void game(){cout << "开挖掘机" << endl;}
};int main()
{Son son;son.init();cout << son.get_name() << endl;son.work(); son.game();son.Father::work();return 0;
}

基类和派生类都是相对的,一个类可能存在又是基类又是派生类的情况,取决于那两个类进行比较。

构造函数

1.派生类与基类构造函数的关系

构造函数与析构函数不能被继承。

#include <iostream>
using namespace std;// 基类
class Father
{
private:string name;
public:Father(string name):name(name){}    // 有参构造函数string get_name(){return name;}
};// 派生类
class Son:public Father
{
};int main()
{
//    Son s;    // 找不到基类的无参构造函数
//    Son s("张"); // 找不派生类的有参构造函数return 0;
}
2.解决方案
(1)补充基类的无参构造函数
#include <iostream>
using namespace std;// 基类
class Father
{
private:string name;
public:// 无参构造函数Father():name("张"){}// 有参构造函数Father(string name):name(name){}string get_name(){return name;}
};// 派生类
class Son:public Father
{
public:
};int main()
{Son s;    cout << s.get_name() << endl;return 0;
}
(2)手动在派生类中调用基类构造函数
1.透传构造

在派生类的构造函数中,调用基类的构造函数,实际上编译器自动添加的派生类构造函数,调用基类无参构造函数时,就是采用的这种方式。

#include <iostream>
using namespace std;// 基类
class Father
{
private:string name;
public:// 有参构造函数Father(string name):name(name){}string get_name(){return name;}
};// 派生类
class Son:public Father
{
public:// 编译器会自动添加构造函数,透传调用基类无参构造函数(透传构造)// Son():Father(){}// 手动添加构造函数,透传构造Son():Father("王"){}// 有参构造函数,调用基类有参构造函数Son(string fn):Father(fn){}
};int main()
{Son s;cout << s.get_name() << endl;Son s1("张");cout << s1.get_name() << endl;return 0;
}

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

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

相关文章

HTML段落,换行,水平线标签与其属性

段落标签 段落标签是通过<p> </p>来定义的。 </head> <body><p>这是一个段落</p> </body> </html> 换行标签 换行标签通过<br>来定义&#xff0c;换行标签可以在不产生新的段落的情况下进行换行操作。 </head> …

更新C语言题目

1.以下程序输出结果是() int main() {int a 1, b 2, c 2, t;while (a < b < c) {t a;a b;b t;c--;}printf("%d %d %d", a, b, c); } 解析:a1 b2 c2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1 a<b 不成立…

RTE大会报名丨 重塑语音交互:音频技术和 Voice AI,RTE2024 技术专场第一弹!

Voice AI 实现 human-like 的最后一步是什么&#xff1f; AI 视频爆炸增长&#xff0c;新一代编解码技术将面临何种挑战&#xff1f; 当大模型进化到实时多模态&#xff0c;又将诞生什么样的新场景和玩法&#xff1f; 所有 AI Infra 都在探寻规格和性能的最佳平衡&#xff0…

Java—反射机制详解

介绍反射 反射的基本概念 反射&#xff08;Reflection&#xff09;是Java语言中的一种机制&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法等类的内部结构。通过反射&#xff0c;你可以在运行时获取类的信息&#xff0c;包括类的构造器、字段、方法等&#xf…

服务器安装pytorch_geometric torch_scatter踩坑记录

conda create -n pyg python3.8.12 pip install torch1.13.0安装的版本如下 pip install torch-scatter pip install torch-sparse pip install torch-cluster pip install torch-spline-conv pip install torch-geometric2.2.0 pip install ipykernel python -m ipykernel i…

Java—注解机制详解

概念 注解是类的组成部分&#xff0c;可以为类携带额外的信息&#xff0c;提供一种安全的注释标记机制&#xff0c;用于将任何信息或元数据与程序元素&#xff08;如类、方法、成员变量等&#xff09;关联。 注解是供编译器或JVM使用的&#xff0c;编译器或JVM可以根据注解执…

云岚到家 第一天实战总结

为什么使用post发送请求&#xff0c;参数依旧会被拼接带url上呢&#xff1f;这应该就是param 与data传参的区别。即param传参数参数会被拼接到url后&#xff0c;data会以请求体传递 不一定post发送请求&#xff0c;数据一定在请求体中&#xff0c;主要是看数据的格式。 后端c…

c++924

2 #include <iostream> #include <cstring>using namespace std;class MyString { private:char *str; // 记录C风格的字符串int size; // 记录字符串的实际长度public:// 定义无参构造MyString() : size(0) {str new char[1];str[0] \0;cou…

《深度学习》—— 神经网络中的数据增强

文章目录 一、为什么要进行数据增强&#xff1f;二、常见的数据增强方法1. 几何变换2. 颜色变换3. 尺寸变换4. 填充5. 噪声添加6. 组合变换 三、代码实现四、注意事项五、总结 一、为什么要进行数据增强&#xff1f; 神经网络中的数据增强是一种通过增加训练数据的多样性和数量…

Python接口自动化测试输出日志到控制台和文件

一、日志的作用 一般程序日志出自下面几个方面的需求&#xff1a; 1. 记录用户操作的审计日志&#xff0c;甚至有的时候就是监管部门的要求。 2. 快速定位问题的根源 3. 追踪程序执行的过程。 4. 追踪数据的变化 5. 数据统计和性能分析 6. 采集运行环境数据 一般在程序上线之后…

2024 年 8 月公链行业研报:Layer 1、比特币 Layer 2 和以太坊 Layer 2 趋势分析

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 公链研究页面 8 月&#xff0c;加密货币市场波动剧烈&#xff0c;比特币和以太坊均遭遇了明显下跌。Layer 1 区块链普遍遭受市场颓势&#xff0c;然而&#xff0c;Tron 却逆势…

考研数据结构——C语言实现插入排序

插入排序是一种简单直观的比较排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采用in-place&#xff08;原地排序&#xff09;&#…

【python篇】python pickle模块一篇就能明白,快速理解

持久性就是指保持对象&#xff0c;甚至在多次执行同一程序之间也保持对象。通过本文&#xff0c;您会对 Python对象的各种持久性机制&#xff08;从关系数据库到 Python 的 pickle以及其它机制&#xff09;有一个总体认识。另外&#xff0c;还会让您更深一步地了解Python 的对象…

【深度】边缘计算神器之数据网关

分布式计算、云边协同、互联互通是边缘计算设备的三项重要特征。 边缘计算设备通过分布式计算模式&#xff0c;将数据处理和分析任务从中心化的云平台下放到设备网关&#xff0c;即更接近数据源的地方&#xff0c;从而显著降低了数据传输的延迟&#xff0c;提高了响应速度和处…

算法4-----综合训练(3)

一&#xff1a;优美的排列 题目&#xff1a; 有1~n的n个整数&#xff0c;用这些数构造一个数组perm&#xff0c;只要构造的数组满足以下两个条件&#xff1a; &#xff08;1&#xff09;i可以被perm[i]整除 &#xff08;2&#xff09;perm[i]可以被i整除 返回其能构造出的…

影刀RPA应用迁移应用复制完整步骤-本地工具

影刀应用迁移工具本地版 不需要输入影刀的用户名和密码就能实现应用的迁移 依赖本地电脑中登录的账号 使用方法 打开软件需要激活,请联系: 左侧选择一个账号选择需要迁移的应用选择目标账号选择要替换的应用 需要用目标账号创建一个空应用,然后在这一步选择点击替换 Q&A…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveRelative

机器自动化控制器——第三章 轴指令 5 MC_MoveRelative变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_MoveRelative 指定自指令当前位置起的移动距离&#xff0c;进行定位。 指令名称FB/FUN图形表现ST表现MC…

【环境搭建】MySQL安装部署

Win64安装MySQL Windows的玩法比较少&#xff0c;没有像MAC一样给你提供mysqld-safe等等各种的启动脚本&#xff0c;只有手动启动或者是以服务启动Mysql。 点击下载&#xff1a;MySQL5.5-8.0.7z (密码是11) 1.下载软件 这一步下载好软件就可以了&#xff0c;下载地址&#xff…

海山数据库(He3DB)技术分享:He3DB Virtual File Descriptor实现原理

引言 在 He3DB 这样的数据库系统中&#xff0c;文件操作不仅频繁而且复杂。操作系统提供的文件描述符&#xff08;FD&#xff09;数量是有限的&#xff0c;尤其在高并发和大规模数据库操作中&#xff0c;文件描述符资源可能迅速耗尽。为了应对这一挑战&#xff0c;He3DB 引入了…

《深度学习》CNN 数据增强、保存最优模型 实例详解

目录 一、数据增强 1、什么是数据增强 2、目的 3、常用的数据增强方法 4、数据预处理 用法&#xff1a; 5、使用数据增强增加训练数据 二、保存最优模型 1、什么是保存最优模型 2、定义CNN模型 运行结果&#xff1a; 3、设置训练模式 4、设置测试模式、保存最优模…