[C++随笔录] vector使用

2023-09-21 15:03:35

通过上一篇文章 string的模拟实现, 其实我们就已经踏入了STL的门槛.
STL容器的大致用法是差不多的 ⇒ 那我们这篇博客就讲一点跟string类不一样的新颖的东西

初始化

跟string一样, vector可以采用下面的形式初始化

// 默认空间, 默认初始化
vector<int> vec;

// 开10个空间, 初始化为系统默认
vector<int> vec(10);

// 开10个空间, 初始化为1
vector<int> vec(10, 1);

vector可以采用 迭代器区间初始化👇👇👇

  1. 采用同类型的迭代器区间
vector<string> vs1;
vs1.push_back("hello world");

vector<string> vs2 (vs1.begin(), vs1.end());
for (auto e : vs2)
{
	cout << e << " ";
}
cout << endl;

*****
hello world
*****
  1. 采用不同类型的迭代器区间
vector<char> vc(5, 'b');

vector<int> vs2(vc.begin(), vc.end());
for (auto e : vs2)
{
	cout << e << " ";
}
cout << endl;

*****
98 98 98 98 98
*****
  1. 采用数组
int a[5] = { 1,2,3,4,5 };
vector<int> vi (a, a + sizeof(a) / sizeof(int));

for (auto e : vi)
{
	cout << e << " ";
}
cout << endl;

*****
1 2 3 4 5
*****

排序算法

vector容器本身是没有 sort算法的, 但是算法库中是有 sort算法的, 头文件是 <algorithm>
👇👇👇

int a[8] = { 11,25,3,14,5, 6, 18,20 };
vector<int> vi (a, a + sizeof(a) / sizeof(int));

sort(vi.begin(), vi.end());

for (auto e : vi)
{
	cout << e << " ";
}
cout << endl;

*****
3 5 6 11 14 18 20 25
*****

发现, 默认是升序的, 那么如何进行降序呢?

int a[8] = { 11,25,3,14,5, 6, 18,20 };
vector<int> vi (a, a + sizeof(a) / sizeof(int));

greater<int> gt; // greater<int> 仿函数对象
sort(vi.begin(), vi.end(), gt);

for (auto e : vi)
{
	cout << e << " ";
}
cout << endl;

*****
25 20 18 14 11 6 5 3
*****

int a[8] = { 11,25,3,14,5, 6, 18,20 };
vector<int> vi (a, a + sizeof(a) / sizeof(int));

less<int> l;
sort(vi.begin(), vi.end(), l);

for (auto e : vi)
{
	cout << e << " ";
}
cout << endl;

*****
3 5 6 11 14 18 20 25
*****

上面的 greaterless 是两个仿函数, int 是 模版参数
由于 sort是一个 函数模版 ⇒ 里面的参数是 对象
那么greater 和 less两个仿函数也要传两个对象过去, 即 gtl
⇒ 由此, 我们可以得出: sort函数默认里面放的是less仿函数的对象

由于里面传的是一个对象, 那么匿名对象也是可以的
其实, 我们也可以这样写👇👇👇

int a[8] = { 11,25,3,14,5, 6, 18,20 };
vector<int> vi (a, a + sizeof(a) / sizeof(int));

sort(vi.begin(), vi.end(), greater<int> ());

for (auto e : vi)
{
	cout << e << " ";
}
cout << endl;

其实, 如果要排降序, 我们也可以抖个机灵反向迭代器

int a[8] = { 11,25,3,14,5, 6, 18,20 };
vector<int> vi (a, a + sizeof(a) / sizeof(int));

sort(vi.rbegin(), vi.rend());

for (auto e : vi)
{
	cout << e << " ";
}
cout << endl;

*****
25 20 18 14 11 6 5 3
*****

reverse和resize

  1. reverse — — 开空间
  2. resize — — 开空间 + 初始化

基础不好的同学看到这里就有疑问了:
🗨️ reverse 和 resize 的功能重复了, 要一个就可以了! 开空间是最重要的, 那要一个reverse就可以. 初始化啥的, 我们后面自己弄就行了

  • 其实, 这个问题, 我们在 string的模拟实现 中就有答案!
    先看下面的一个例子👇👇👇
vector<int> vec;
vec.reserve(10);

for (int i = 0; i < 10; i++)
{
	vec[i] = i;
}

*****
error
*****

这是因为 operator[] 的实现中, 我们有一个断言 ⇒ assert(i < _size)
这里, 我们开了10个空间 ⇒ _capacity = 10;
但 _size(数据个数) = 0;
⇒ 由于断言, 我们是不能插入数据的

如果要用 []来进行插入数据, 那么我们要用如下的方式👇👇👇

vector<int> vec;
vec.resize(10);

for (int i = 0; i < 10; i++)
{
	vec[i] = i;
}

那我们非要用 reverse 来进行插入数据, 那么我们不应该用 [], 而是用 push_back

  1. push_back 和 _size没有关系, 不够了也只是扩容而已
  2. push_back过后, _size是会进行++的
vector<int> vec;
vec.reserve(10);

for (int i = 0; i < 10; i++)
{
	vec.push_back(i);
}

由此, 我们可以得出:

  1. operator[] 是跟 _size 密切相关的
  2. push_back 的使用就比较宽松
  3. 并不是开好了空间, 就一定能进行插入数据的

人需在事上磨,方可立得住,方能静亦定,动亦定. — ---- 王阳明
译:有个学生问王阳明,安静的时候我感觉很不错,思想清晰,可一遇到事情就乱了阵脚,为什么?
王阳明说:“这是你只知道静养,却没有下克己的功夫.这样一来,碰到事情就乱了阵脚. 人应该在具体的事情上磨炼自己,才能站得稳,才能静亦定,动亦定.

更多推荐

一文搞懂并查集

一文搞懂并查集1背景意义2原理讲解3路径压缩4代码模板1背景意义首先要知道并查集可以解决什么问题呢?并查集常用来解决连通性问题。大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。并查集主要有两个功能:将两个元素添加到一个集合中;判断两个元素在不在同一个集合。接下来围绕并查集的这两个功能来展

JWT 安全及案例实战

文章目录一、JWT(jsonwebtoken)安全1.Cookie(放在浏览器)2.Session(放在服务器)3.Token4.JWT(jsonwebtoken)4.1头部4.1.1alg4.1.2typ4.2payload4.3签名4.4通信流程5.防御措施二、漏洞实例(webgoat)1.第四关2.第五关3.第七

uniappAndroid平台签名证书(.keystore)生成

一、安装JRE环境https://www.oracle.com/java/technologies/downloads/#java8记住下载默认安装地址。ps:我都默认安装地址C:\ProgramFiles\Java\jdk-1.8二、安装成功后配置环境变量系统变量配置AVA_HOME放到环境变量去%JAVA_HOME

nginx部署多个项目

前言实现在一台服务器上使用nginx部署多个项目的方法查看并修改nginx安装的默认配置文件在Linux操作系统中,Nginx在编译安装时默认的配置文件路径是/usr/local/nginx/conf/nginx.conf。如果是通过发行版的包管理器安装,则默认的配置文件路径可能会相应改变,例如在Ubuntu下为/et

Vue中使用VueAMap

npm安装npminstallvue-amap--save注册:高德地图//在main.js中注册:高德地图importVueAMapfrom"vue-amap";Vue.use(VueAMap);VueAMap.initAMapApiLoader({key:"你的高德key",plugin:["AMap.AutoCo

【K8S系列】深入解析k8s网络插件—Flannel

序言做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。文章标记颜色说明:黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点Kubernetes(k8s)是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s网络插件相关知识希望这篇文章能让你不仅有一定的收获,而且可以愉快的

C++ 类(1)

你知道吗,C++类是编程世界中的一种强大工具,它可以帮助我们更好地组织和管理代码。接下来,我将为你呈现一篇近万字的C++类的教程,希望能帮助你熟悉这个概念。首先,让我们从C++类的定义开始。类是一个模板,它描述了一种具有相同属性和行为的数据类型。听起来很复杂吗?别担心,我来给你举个例子。假设我们要创建一个名为"Car"

PostgreSQL 技术内幕(十)WAL log 模块基本原理

事务日志是数据库的重要组成部分,记录了数据库系统中所有更改和操作的历史信息。WALlog(WriteAheadLogging)也被称为xlog,是事务日志的一种,也是关系数据库系统中用于保证数据一致性和事务完整性的一系列技术,在数据库恢复、高可用、流复制、逻辑复制等模块中扮演着极其重要的角色。在这次直播中,我们为大家介

【8B10B编解码及verilog(xilinx example)解析】

8B10B编解码及verilog(xilinxexample)解析编码查表算法解码代码解析极性控制字K码编码8b/10b编码将串行的数据以8bit为一个单位进行编码处理得到一个10bit的数据,具体怎么操作呢,假设原始8位数据从高到低用HGFEDCBA表示,将8位数据分成高3位HGF和低5位EDCBA两个子组。经过5B

成都直播基地火热招商中,天府蜂巢成都直播基地招商政策汇总

随着直播产业的发展,四川天府新区也在逐步形成成熟的直播产业链。近日,记者采访到成都天府蜂巢直播产业基地即将竣工,正式进入运营阶段,作为成都科学城兴隆湖高新技术服务产业园的主打新一代成都直播基地,正积极招商中!引领大规模的平台聚合发展的树莓集团与专注城市资产运营的上市公司德商产投携手打造产业+直播赋能平台——成都天府蜂巢

MyBatis初级

文章目录一、mybatis1、概念2、JDBC缺点2.1、之前jdbc操作2.2、原始jdbc操作的分析3、mybatis的使用3.1、导入maven依赖3.2、新建表3.3、实体类3.4、编写mybatis的配置文件3.5、编写接口和映射文件3.6、编写测试类3.7、注意事项4、代理方式开发5、mybatis和spr

热文推荐