当前位置: 首页 > news >正文

【机试准备】常用容器与函数

Vector详解

原文链接:【超详细】C++ vector 详解 + 例题,这一篇就够了-CSDN博客

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组

容器特性:

  1. 顺序序列:顺序容器中的元素按照严格的线性序列排列。可以通过元素在序列中的位置访问对应的元素。
  2. 动态数组:支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。
  3. 能够感知内存分配器的:容器使用一个内存分配器对象来动态地处理它的存储需求。

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详解 原文链接&#xff1a;【超详细】C vector 详解 例题&#xff0c;这一篇就够了-CSDN博客 向量&#xff08;Vector&#xff09;是一个封装了动态大小数组的顺序容器&#xff08;Sequence Container&#xff09;。跟任意其它类型容器一样&#xff0c;它能够存放各种…...

Base 社区见面会 | 新加坡站

活动信息 备受期待的 Base 社区见面会将于 Token2049 期间在新加坡举行&#xff0c;为 Base 爱好者和生态系统建设者提供一个独特的交流机会。本次活动由 DAOBase 组织&#xff0c;Base 和 Coinbase 提供支持&#xff0c;并得到了以下合作伙伴的大力支持&#xff1a; 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 进一步扩大其在汽车领域的领先地位 产品亮点 &#xff1a; 峰值性能比 Imagination 上一代汽车 GPU 提高了 50%&#xff0c;可扩展至 192GPixel/s、6 TFLOPS 和 24TOPS计算工作负载的性能提升多达十倍引入创新的分布式功能安全机制&#xff0c;以最小的…...

端口大全说明,HTTP,TCP,UDP常见端口对照表

HTTP,TCP,UDP常见端口对照表,下面罗列了包括在Linux 中的服务、守护进程、和程序所使用的最常见的通信端口小贴士&#xff1a;CtrlF 快速查找 Http端口号&#xff08;点标题可收缩或展开&#xff09; No1.最常用端口 端口号码/层名称注释1tcpmuxTCP端口服务多路复用5rje远程作…...

dplyr、tidyverse和ggplot2初探

dplyr、tidyverse 和 ggplot2 之间有紧密的联系&#xff0c;它们都是 R 语言中用于数据处理和可视化的工具&#xff0c;且都源于 Hadley Wickham 的工作。它们各自有不同的功能&#xff0c;但可以无缝协作&#xff0c;帮助用户完成从数据处理到数据可视化的工作流。以下是它们之…...

pandas:读取各类文件方法以及爬虫时json数据保存

文件的读取与写入 | 常用读文件方法 | 说明 | | -------------- | ---------------- | | read_csv | 读取CSV文件 | | read_excel | 读取Excel文件 | | read_html | 读取网页HTML文件 | | read_table | 通用读取方法 | | 常用写文…...

二、(JS)JS中常见的键盘事件

一、常见的键盘事件 onkeydown 某个键盘按键被按下onkeypress 某个键盘按键被按下onkeyup 某个键盘按键被松开 二、事件的执行顺序 onkeydown、onkeypress、onkeyup down 事件先发生&#xff1b;press 发生在文本被输入&#xff1b;up …...

【CSS】样式水平垂直居中

行内元素&#xff1a; 如果被设置元素为文本、图片等行内元素时&#xff0c;水平居中是通过给父元素设置 text-align:center <body> <div class"txtCenter">我想要在父容器中水平居中显示。</div> </body>div是文本元素的父元素 因此我们对…...

深入理解数据分析的使用流程:从数据准备到洞察挖掘

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

CSS 响应式设计(补充)——WEB开发系列36

随着移动设备的普及&#xff0c;网页设计的焦点逐渐转向了响应式设计。响应式设计不仅要求网页在各种屏幕尺寸上良好展示&#xff0c;还要适应不同设备的特性。 一、响应式设计之前的灵活布局 在响应式设计流行之前&#xff0c;网页布局通常是固定的或流动的。固定布局使用固定…...

Qt常用控件——QDateTimeEdit

文章目录 QDateTimeEdit核心属性及信号时间计算器 QDateTimeEdit核心属性及信号 QDateEdit作为日期的微调框QTimeEdit作为时间的微调框QDateTimeEdit作为时间日期的微调框 它们的使用方式都是类似的&#xff0c;本篇以QDateTimeEdit作为示例 核心属性&#xff1a; 属性说明…...

什么是上拉,下拉?

上拉就是将引脚通过一个电阻连接到电源&#xff0c;作用&#xff1a;1.使IO口的不确定电平稳定在高点平&#xff0c;2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连&#xff0c;作用&#xff1a;1.从器件输出电流 2.当IO口为输入状态时&#xff0c;引脚的…...

76-mysql的聚集索引和非聚集索引区别

MySQL中的聚集索引和非聚集索引的主要区别在于它们的存储方式和使用方式。 聚集索引&#xff08;Clustered Index&#xff09;&#xff1a; 聚集索引的叶子页包含了行的全部数据。 每个表只能有一个聚集索引&#xff0c;因为一个表中的数据只能按照一种方式存储。 当你查询的…...

每日一题——第八十八题

题目&#xff1a;输入一个9位的无符号整数&#xff0c;判断其是否有重复数字 #include<stdio.h> #include<stdbool.h> #include<string.h> int main() {char num_str[10];printf("请输入一个9位数的无符号数&#xff1a;");scanf_s("%9d&quo…...

【创作活动】学习使用哪个编程工具让你的工作效率翻倍?

学习使用哪个编程工具让你的工作效率翻倍&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程…...

基于STM32C8T6的CubeMX:HAL库点亮LED

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

职业院校数据科学与大数据技术专业人工智能实训室建设方案

一、引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其在全球范围内的应用日益广泛&#xff0c;从智能交通、环境保护到公共安全、智能家居等多个领域均展现出巨大的潜力。然而&#xff0c;我国在人工智能领域的人才储备仍显不足&#xff0c;这已成为…...

JavaScript网页设计案例分析

JavaScript网页设计案例分析 随着互联网技术的发展&#xff0c;JavaScript 已经成为现代网页设计中不可或缺的一部分。从简单的页面交互到复杂的应用程序开发&#xff0c;JavaScript 都发挥着至关重要的作用。本文将探讨几个运用 JavaScript 进行网页设计的经典案例&#xff0…...

2024.9.15周报

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

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...