【机试准备】常用容器与函数
Vector详解
原文链接:【超详细】C++ vector 详解 + 例题,这一篇就够了-CSDN博客
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组
容器特性:
- 顺序序列:顺序容器中的元素按照严格的线性序列排列。可以通过元素在序列中的位置访问对应的元素。
- 动态数组:支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。
- 能够感知内存分配器的:容器使用一个内存分配器对象来动态地处理它的存储需求。
vector数组初始化
以下全部使用int举例
1.定义空向量
vector<int> a; //相当于空数组
2.定义具有10个整型元素的向量
vector<int> a(10); //相当于a[10]
3.定义具有10个整型元素的向量,且赋予每个元素初值为1
vector<int> a(10,1); //相当于a[10] = {1}
4.定义与向量b具有相同值的向量a
vector<int> a(b); //将向量b赋值给向量a,即向量a等于向量b
5.将向量b中下标0-1(共三个)的元素赋值给a
//第一个数据是起始地址,第二个数据是结束地址(不包括),第二个数据就是你要截取的长度加1
vector<int> a(b.begin(), b.begin()+3);
6.从数组中获得初值
int b[7] = {1,2,3,4,5,6,7}; //定义整形数组vector<int> a(b, b+7); //将数组b赋值给a,第一个数据是起始地址,第二个数据是结束地址(不包括)
7.二维数组初值化
vector<vector<int>> a; //初始化为int型二维数组,相当于int a[][]
vector对象常用内置函数
首先定义两个vector向量,进行下面函数演示:
vector<int> a, b;
1. assign()函数:可对已定义好的vector向量进行赋值
//将b的下标为0-2的元素赋值给向量a
a.assign(b.begin(), b.begin()+3);//使向量a变为长度为4且值为2
a.assign(4,2);
测试用例:
int main(){a.assign(5, 3);for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;a.assign(4, 2);for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} //输出:
3 3 3 3 3
2 2 2 2
2. back()函数
a.back(); //返回a的最后一个元素
3. front()函数
a.front(); //返回a的第一个元素
4.取向量a中第i个数据
a[i]; //返回a的第i元素,当且仅当a存在
5.clear()函数
a.clear(); //清空a中的元素
6. empty()函数
a.empty(); //判断向量a是否为空,若为空空则返回true,非空则返回false
7. push_back()函数
a.push_back(5); //在向量a的最后插入一个元素,其值为5
8.pop_back()函数
a.pop_back(); //删除a向量的最后一个元素
测试用例
int main(){a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);cout << "使用push_back压入函数后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl << endl;cout << "使用pop_back删除函数后:";a.pop_back(); a.pop_back();for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} //输出:
使用push_back压入函数后:1 2 3 4 5
使用pop_back删除函数后:1 2 3
9. erase()函数
erase可以删去容器中指定位置的元素,容器的size(大小)会改变,但是容器的容量不变。
//删除a向量中全部元素
a.erase(a.begin(), a.end());//删除a向量中下标0-2共三个元素
a.erase(a.begin(), a.begin()+3);
测试程序
int main(){for(int i = 1; i < 5; i++) a.push_back(i); //输入数据cout << "使用erase删除前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;a.erase(a.begin(), a.begin() + 3);cout << "使用erase删除后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} //输出:
使用erase删除前:1 2 3 4 5
使用erase删除后:4 5
insert()函数
//在a向量第二个元素(下标从0开始)后插入 8
a.insert(a.begin()+2, 8);//在a向量的第二个元素(下标从0开始)后插入3个数,其值都为5
a.insert(a.begin()+1, 3, 8);//b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
a.insert(a.begin()+1, b+3, b+6);
测试用例
void fun(){a.clear(); //清空a for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据b.assign(10, 6); //对b输入数据
}int main(){fun(); cout << "使用insert插入前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;a.insert(a.begin() + 2, 8);cout << "使用insert插入后:" ;for(int i = 0; i < a.size(); i++) cout << a[i] << " ";cout << endl << endl;fun(); cout << "使用insert插入前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;a.insert(a.begin() + 2, 3, 8);cout << "使用insert插入后:" ;for(int i = 0; i < a.size(); i++) cout << a[i] << " ";cout << endl << endl;fun(); cout << "使用insert插入前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;a.insert(a.begin() + 2, b.begin()+3, b.begin()+6);cout << "使用insert插入后:" ;for(int i = 0; i < a.size(); i++) cout << a[i] << " ";cout << endl;return 0;
} //输出:
使用insert插入前:1 2 3 4 5
使用insert插入后:1 2 8 3 4 5使用insert插入前:1 2 3 4 5
使用insert插入后:1 2 8 8 8 3 4 5使用insert插入前:1 2 3 4 5
使用insert插入后:1 2 6 6 6 3 4 5
11. size()
a.size(); //返回向量a中元素的个数
12. capacity()函数
capacity是指在发生realloc(动态分配)前能允许的最大元素数,即预分配的内存空间。
a.capacity(); //返回a在内存中总共可以容纳的元素个数
测试用例:
int main(){for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据cout << "a向量值:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl;cout << "a.size = " << a.size() << endl;cout << "a.capacity = " << a.capacity();return 0;
} //输出
a向量值:1 2 3 4 5
a.size = 5
a.capacity = 8
13. resize()函数
//将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10);//将a的现有元素个数调整至10个,多则删,少则补,其值为2
a.resize(10, 2);
测试用例:
void fun(){a.clear(); //清空a for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据b.assign(10, 6); //对b输入数据
}int main(){fun();cout << "使用resize前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl << endl; a.resize(10);cout << "使用a.resize(10)后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl << endl;fun(); a.resize(10, 2);cout << "使用a.resize(10, 2)后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} //输出:
使用resize前:1 2 3 4 5使用a.resize(10)后:1 2 3 4 5 0 0 0 0 0使用a.resize(10, 2)后:1 2 3 4 5 2 2 2 2 2
14.reserve()函数
a.reserve(100); //将a的容量扩充至100
15.swap()函数
a.swap(b); //b为向量,将a中的元素和b中的元素整体交换
16.两个向量比较
a == b; //相等
a > b; //大于
a >= b; 大于等于
a < b; //小于
a <= b; //小于等于
a != b; //不等于
几个常用的操作函数
头文件
#include<algorithm>
1. sort()函数
sort(a.begin(), a.end()); //对向量a进行从小到大排序
测试用例
int main(){for(int i = 5; i >= 0; i--) a.push_back(i); //对a输入数据cout << "使用sort前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl << endl; sort(a.begin(), a.end());cout << "使用sort后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} 输出:
使用sort前:5 4 3 2 1 0
使用sort后:0 1 2 3 4 5
2.reverse()函数
//对a中的元素从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列
reverse(a.begin(), a.end()); //如a中元素为1,3,2,4,倒置后为4,2,3,1
测试用例
int main(){for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据cout << "使用reverse前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl << endl; reverse(a.begin(), a.end());cout << "使用reverse后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} 输出:
使用reverse前:1 2 3 4 5
使用reverse后:5 4 3 2 1
3. copy()函数
//把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素
copy(a.begin(), a.end(), b.begin()+1);
测试用例:
int main(){for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据b.assign(10, 6); //对b输入数据 cout << "使用copy前向量b为:" ; for(int i = 0; i < b.size(); i++){cout << b[i] << " ";}cout << endl << endl; copy(a.begin(), a.end(), b.begin()+2);cout << "使用copy后向量b为:";for(int i = 0; i < b.size(); i++){cout << b[i] << " ";}return 0;
} //输出:
使用copy前向量b为:6 6 6 6 6 6 6 6 6 6使用copy后向量b为:6 6 1 2 3 4 5 6 6 6
4.find()函数
//在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,
//若存在返回其在向量中的下标,不存在则返回end(),即向量最后一个元素下标加一
find(a.begin(), a.end(), 4);
测试用例
int main(){for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据cout << "使用find前:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}cout << endl << endl; cout << "使用find后返回值index = ";cout << find(a.begin(), a.end(), 4) - a.begin() << endl;return 0;
}//输出:
使用find前:1 2 3 4 5使用find后返回值index = 3
遍历向量
1. 使用下标进行遍历
int main(){for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据cout << "遍历向量a:" ; for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} //输出:
遍历向量a:1 2 3 4 5
2. 通过迭代器进行遍历
int main(){for(int i = 1; i <= 5; i++) a.push_back(i); //对a输入数据cout << "遍历向量a:" ; for(vector<int>::iterator it = a.begin(); it != a.end(); it++){cout << *it << " ";}return 0;
} //输出:
遍历向量a:1 2 3 4 5
对向量添加元素的几种方式
1. 使用push_back() 函数
int main(){a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);a.push_back(5);cout << "使用push_back压入函数后:";for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}return 0;
} //输出:
使用push_back压入函数后:1 2 3 4 5
2. 从数组或现有向量中添加
int main(){int num[6] = {1, 2, 3, 4, 5, 6};for(int i = 0; i < 6; i++) a.push_back(num[i]);for(int i = 0; i < a.size(); i++){cout << a[i] << " ";} return 0;
} //输出:
遍历向量a:1 2 3 4 5
在赋值时一个常犯的错误与注意
1、在使用内置函数时,一定要注意第二个参数范围不包括end()。
2、下标只能用来获取已经存在的元素,so下面使用方法是错误的。
for(int i=0; i<10; i++){a[i] = i; //应使用a.push_back(i)
}
相关文章:
【机试准备】常用容器与函数
Vector详解 原文链接:【超详细】C vector 详解 例题,这一篇就够了-CSDN博客 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种…...

Base 社区见面会 | 新加坡站
活动信息 备受期待的 Base 社区见面会将于 Token2049 期间在新加坡举行,为 Base 爱好者和生态系统建设者提供一个独特的交流机会。本次活动由 DAOBase 组织,Base 和 Coinbase 提供支持,并得到了以下合作伙伴的大力支持: The Sand…...
麒麟操作系统搭建Nacos集群
Nacos 集群搭建 2.4.2 环境介绍 操作系统Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)Kylin Linux Advanced Server V10 (Lance)内核版本Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52.22.v2207.ky10.aarch64Linux 4.19.90-52…...
Imagination推出性能最高且具有高等级功能安全性的汽车GPU IP
Imagination DXS GPU 进一步扩大其在汽车领域的领先地位 产品亮点 : 峰值性能比 Imagination 上一代汽车 GPU 提高了 50%,可扩展至 192GPixel/s、6 TFLOPS 和 24TOPS计算工作负载的性能提升多达十倍引入创新的分布式功能安全机制,以最小的…...
端口大全说明,HTTP,TCP,UDP常见端口对照表
HTTP,TCP,UDP常见端口对照表,下面罗列了包括在Linux 中的服务、守护进程、和程序所使用的最常见的通信端口小贴士:CtrlF 快速查找 Http端口号(点标题可收缩或展开) No1.最常用端口 端口号码/层名称注释1tcpmuxTCP端口服务多路复用5rje远程作…...
dplyr、tidyverse和ggplot2初探
dplyr、tidyverse 和 ggplot2 之间有紧密的联系,它们都是 R 语言中用于数据处理和可视化的工具,且都源于 Hadley Wickham 的工作。它们各自有不同的功能,但可以无缝协作,帮助用户完成从数据处理到数据可视化的工作流。以下是它们之…...
pandas:读取各类文件方法以及爬虫时json数据保存
文件的读取与写入 | 常用读文件方法 | 说明 | | -------------- | ---------------- | | read_csv | 读取CSV文件 | | read_excel | 读取Excel文件 | | read_html | 读取网页HTML文件 | | read_table | 通用读取方法 | | 常用写文…...

二、(JS)JS中常见的键盘事件
一、常见的键盘事件 onkeydown 某个键盘按键被按下onkeypress 某个键盘按键被按下onkeyup 某个键盘按键被松开 二、事件的执行顺序 onkeydown、onkeypress、onkeyup down 事件先发生;press 发生在文本被输入;up …...
【CSS】样式水平垂直居中
行内元素: 如果被设置元素为文本、图片等行内元素时,水平居中是通过给父元素设置 text-align:center <body> <div class"txtCenter">我想要在父容器中水平居中显示。</div> </body>div是文本元素的父元素 因此我们对…...

深入理解数据分析的使用流程:从数据准备到洞察挖掘
数据分析是企业和技术团队实现价值的核心。 5 秒内你能否让数据帮你做出决策? 通过本文,我们将深入探讨如何将原始数据转化为有意义的洞察,帮助你快速掌握数据分析的关键流程。 目录 数据分析的五个核心步骤1. 数据获取常用数据获取方式 2. 数…...

CSS 响应式设计(补充)——WEB开发系列36
随着移动设备的普及,网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示,还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前,网页布局通常是固定的或流动的。固定布局使用固定…...

Qt常用控件——QDateTimeEdit
文章目录 QDateTimeEdit核心属性及信号时间计算器 QDateTimeEdit核心属性及信号 QDateEdit作为日期的微调框QTimeEdit作为时间的微调框QDateTimeEdit作为时间日期的微调框 它们的使用方式都是类似的,本篇以QDateTimeEdit作为示例 核心属性: 属性说明…...

什么是上拉,下拉?
上拉就是将引脚通过一个电阻连接到电源,作用:1.使IO口的不确定电平稳定在高点平,2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连,作用:1.从器件输出电流 2.当IO口为输入状态时,引脚的…...
76-mysql的聚集索引和非聚集索引区别
MySQL中的聚集索引和非聚集索引的主要区别在于它们的存储方式和使用方式。 聚集索引(Clustered Index): 聚集索引的叶子页包含了行的全部数据。 每个表只能有一个聚集索引,因为一个表中的数据只能按照一种方式存储。 当你查询的…...
每日一题——第八十八题
题目:输入一个9位的无符号整数,判断其是否有重复数字 #include<stdio.h> #include<stdbool.h> #include<string.h> int main() {char num_str[10];printf("请输入一个9位数的无符号数:");scanf_s("%9d&quo…...
【创作活动】学习使用哪个编程工具让你的工作效率翻倍?
学习使用哪个编程工具让你的工作效率翻倍? 在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程…...

基于STM32C8T6的CubeMX:HAL库点亮LED
三个可能的问题和解决方法: 大家完成之后回来看,每一种改错误都是一种成长,不要畏惧,要快乐,积极面对,要耐心对待 STMCuBeMX新建项目的两种匪夷所思的问题https://mp.csdn.net/mp_blog/creation/editor/1…...

职业院校数据科学与大数据技术专业人工智能实训室建设方案
一、引言 随着人工智能(AI)技术的迅猛发展,其在全球范围内的应用日益广泛,从智能交通、环境保护到公共安全、智能家居等多个领域均展现出巨大的潜力。然而,我国在人工智能领域的人才储备仍显不足,这已成为…...
JavaScript网页设计案例分析
JavaScript网页设计案例分析 随着互联网技术的发展,JavaScript 已经成为现代网页设计中不可或缺的一部分。从简单的页面交互到复杂的应用程序开发,JavaScript 都发挥着至关重要的作用。本文将探讨几个运用 JavaScript 进行网页设计的经典案例࿰…...

2024.9.15周报
一、题目信息 题目:Physics-informed neural networks for solving flow problems modeled by the 2D Shallow Water Equations without labeled data 链接:物理信息神经网络用于解决由二维浅水方程建模的流动问题,无需标记数据- ScienceDi…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...