#创作计划# vector数组精讲
2025-08-28 10:16:19
发布于:福建
目录
- 第一部分:导言
- 第二部分:什么是动态数组
- 第三部分:vector数组的使用方法
- 第四部分:刷题时光
建议先学习sort排序在来学vector,本文会涉及到sort排序
第一部分:导言
很多人很会用原生态数组(原生态数组如下)
long long arr[10];
但是这样子会很费空间,所以我们今天带来了一种新的动态数组——vector数组
第二部分:什么是动态数组
在我们学习原生态数组时,我们知道,数组是要定长的(定义长度),原生态数组一旦定义,就会分配到固定空间
- 比如
long long arr[10][10][5];//这样就分配到了8*10*10*5的空间(三维数组)
这样在程序执行前已经在内存中分配好的空间,不能在程序执行过程中改变,但是在很多情况下,我们炳不知道数组的确切大小,这是可以用动态数组~
vector是C++中的STL库中的动态数组,所谓的动态数组,就是可以在使用过程中自动的扩容,变长,并不需要预先定义好大小哦~
第三部分:vector数组的使用方法
首先我们先知道vector数组的导入库
#include <vector>//导入vector库
然后就是学习如何定义vector数组
//vector <数据类型> 数组名;
vector <int> arr;
//可以边定义边赋值
vector <int> arr = {1 , 2 , 3 , 4};
再然后就是学习如何操作vector数组
- vector的访问
很多小白可能会这样访问
vector <long long> v;
int main(){
v[0] = 1;
}
但是这样子你就会喜提一个RE,hhh、
因为我们还没输入任何东西,所以数组会越界获得RE(前文说了他是动态数组)
- vector的输入和删除
如果你想在vector数组是读入数据,就可以使用,push_back方法
//vector数组名字 . push_back(读入数据的东西,注意,vector数组并不能读入名字[i])
v.push_back(1);
注意,push_back是直接推进最后一个如下图
推入前
————————————————————
| ———— ———— <---- ————
| |元素1号 | |元素2号| <---- |元素三号|
| ———— ———— <---- ————
|————————————————————
推入后
————————————————————
| ———— ———— ————
| |元素1号 | |元素2号| |元素三号|
| ———— ———— ————
|————————————————————
如果你想删除vector数组末尾(最后一个) 的数据,可以使用pop_back()方法
//vector数组名字 . pop_back();
v . pop_back();
删除前
————————————————————
| ———— ———— ———— ------->
| |元素1号 | |元素2号| |元素三号| ------->
| ———— ———— ———— ------->
|————————————————————
删除后
————————————————————
| ———— ————
| |元素1号 | |元素2号|
| ———— ————
|————————————————————
访问元素
可以使用下标操作符 [] 或 at() 方法访问 vector 中的元素:
但是你得确保数组里有数据,这个是very very重要的!!!
int x = v[0]; // 获取第一个元素
int y = v .at(1); // 获取第二个元素
清空vector
如果你想清空整个vector,可以使用clear()方法
// vector数组名称 . clear();
v . clear();
清除前
————————————————————
| ———— ———— ————
| |元素1号 | |元素2号| |元素三号|
| ———— ———— ————
|————————————————————
清除后
————————————————————
|
|(我是空的!!!!!!!!!!!!!!!!)
|
|————————————————————
begin与end
begin
-
begin:代表开的地址
-
如果你要获取开头元素时,就要多一个*,当然啦也可以数组名[0]解决
end
- end以为结尾,end是vector的结尾元素的下一个位置的地址
- 所以,end - 1才是最后一个元素的地址
- 所以,* (v . end() - 1)表示输出v中的最后一个有效元素
- 注意:在使用begin和end时,一定要保证vector非空!
vector的长度:
可以使用 size() 方法获取 vector 中元素的数量:
int size = v . size(); // 获取 vector 中的元素数量
vector的排序
因为有一些人还不费sort排序,这里我就讲一下
sort排序的专用库是algorithm(记得导入)
然后就是语法sort(开始位置 , 结尾最后一个位置)
- 例如,我们想对数组中a[0]道a[8]这九个元素排序时(这是原生态数组)可以写
sort(a , a + 9);//sort不包含a[9]
所以vector数组的排序就要用到begin和end
sort(v . begin() , v . end()):
第四部分:刷题时光
first:B2089 数组逆序重存放
- 题目大意:读入一个整数n,然后输入一个给我们排序好的n个数,让我们倒序输出
- 题目思路:可以使用vector数组先读入这些数,然后逆序输出
step01:定义vector数组
vector <long long> arr;
step02:读入数据并逆序输出
for (int i = 0 ; i < n ; i++) {
long long x;
cin >> x;
arr . push_back(x);
}
for (int i = arr.size() - 1 ; i >= 0 ; i--) {
cout << arr[i] << " ";
}
最后就是环节了
#include <vector>
#include <iostream>
using namespace std;
long long n;//定义n(个数)
int main() {//主函数
cin >> n;//读入个数
vector<long long> arr;//定义动态数组
for (int i = 0 ; i < n ; i++) {
long long x;//因为vector并不能push_back(arr[i]);所以我们使用一个变量存储数据在放到vector数组里
cin >> x;
arr . push_back(x);
}
for (int i = arr.size() - 1 ; i >= 0 ; i--) {
cout << arr[i] << " ";//逆序输出
}
return 0;
}
second:B2093 查找特定的值
- 题目大意:读入n个数,查找x第一次出现的位置,如果这n个数里并不包含x的话,输出-1
- 题目思路:首先还是先读入这些数,然后使用pos变量来算位置,最后判断
step01
定义并读入
long long n , x , pos = 0;
int main() {
vector <long long> numbers;
cin >> n;
for (int i = 0 ; i < n ; i++) {
long long some_number;
cin >> some_number;
numbers.push_back(some_number);
}
step02:随后查找x
cin >> x;
for (int i = 0 ; i < n ; i++) {
if (numbers[i] == x && pos == 0) {
pos = i;
break;//找到第一次出现的位置直接break掉了
}
}
step03:最后判断
if (pos > 0) {
cout << pos << endl;
}else {
cout << "-1" << endl;
}
环节来啦!
#include <iostream>
#include <vector>//vector库
using namespace std;
long long n , x , pos = 0;//定义个数,查找数,和位置数
int main() {//主函数
vector <long long> numbers;//定义numbers动态数组
cin >> n;//读入个数
for (int i = 0 ; i < n ; i++) {
long long some_number;
cin >> some_number;
numbers.push_back(some_number);//读入数据
}
cin >> x;//注意题目读入顺序,先读入数组在读入查找淑
for (int i = 0 ; i < n ; i++) {//循环遍历一下整个数组
if (numbers[i] == x && pos == 0) {//如果找到了这个数组的某个位置且pos为0(没找到数)
pos = i;//pos等于i
break;//结束
}
}
if (pos > 0) {//如果pos大于0(有找到第一次出现位置)
cout << pos << endl;//输出pos
}else {//否则
cout << "-1" << endl;//输出-1
}
return 0;
}
third:B2094 不与最大数相同的数字之和
- 题目大意:在n个数中,输出不是最大数相同的数字的和
- 方法:先读入,然后再查找最大数,最后除最大数以外的数算出和
step01:定义并读入
long long n , mx = 0 , sum = 0;//定义个数,查找数,和位置数
int main() {//主函数
vector <long long> numbers;//定义numbers动态数组
cin >> n;//读入个数
for (int i = 0 ; i < n ; i++) {
long long some_number;
cin >> some_number;
numbers.push_back(some_number);//读入数据
}
steo02:找出最大值
for (int i = 0 ; i < n ; i++) {
if (numbers[i] > mx) {
mx = numbers[i];
}
}
step03:求和
for (int i = 0 ; i < n ; i++) {
if (numbers[i] != mx) {//除了与最大数相同的数除外
sum += numbers[i];//计数器加上他
}
}
step04:输出和
cout << sum << endl;
环节来啦
#include <iostream>
#include <vector>//vector库
using namespace std;
long long n , mx = 0 , sum = 0;//定义个数,最大数存储变量,计数器
int main() {//主函数
vector <long long> numbers;//定义numbers动态数组
cin >> n;//读入个数
for (int i = 0 ; i < n ; i++) {
long long some_number;
cin >> some_number;
numbers.push_back(some_number);//读入数据
}
//17~22行是查找最大数的模版
for (int i = 0 ; i < n ; i++) {
if (numbers[i] > mx) {
mx = numbers[i];
}
}
//24~29是求和模版
for (int i = 0 ; i < n ; i++) {
if (numbers[i] != mx) {//除了与最大数相同的数除外
sum += numbers[i];//计数器加上他
}
}
cout << sum << endl;//输出和
return 0;
}
创作不易,给一个赞吧,求求了
全部评论 21
差点成为全网含金量最高的精华帖了
5天前 来自 广东
3含史量
4小时前 来自 浙江
0
不明白评论区为何那么多恶意,人家就算是蒟蒻、做的东西简单,也轮不到你们来喷,毕竟是新手,markdown丑也正常啊,阁下如此nb,何不上九霄
2小时前 来自 上海
1- 目前已取消本次内容的置顶精选,建议@AC是最好的后续结合评论区各位的建议,进一步优化内容。
- 针对此次社区对线争议,需明确:对线行为违反社区交流规范,双方在沟通中均存在不当之处,因此决定对双方各执行1天禁言处罚,以正社区风气;
- 请其他同学不要再围绕此事展开讨论,避免争议扩大,感谢理解与配合~
5天前 来自 浙江
1OK
5天前 来自 浙江
0
这种东西还要创作计划...
6天前 来自 北京
1markdown也是一坨,这个代码也是逆天
5天前 来自 浙江
0兑。
5天前 来自 河北
0那咋了
5天前 来自 福建
1
好
2小时前 来自 上海
0顶
2小时前 来自 广东
0wa上榜了!
3小时前 来自 浙江
0这期糖分超标了(春恶意
4小时前 来自 浙江
0诡异 Markdown
5天前 来自 上海
0就是有没有人知道
array
这玩意儿已经比我们 ACGO 绝大多数人的年龄还大了5天前 来自 上海
01.基础东西没必要创做计划2,.谁家好人用numbers()3.markdown一坨,4.人和rz一样
5天前 来自 河北
0不喜请喷
5天前 来自 河北
0支持对线
5天前 来自 河北
0我用numbers干嘛了
5天前 来自 福建
0
你个不日栽的肥肉虫要是还对 AAA混泥土批发ppl哥 乱叫
劳资直接去你婶婶的桃子爸爸的西瓜姥姥的黄瓜三叔的小荔枝
三舅姥爷的猕猴桃六姥爷的葡萄姑姑的车厘子祖爷爷大芹菜
祖姥爷的大菠萝祖姥爷的大菠萝蜜祖奶奶的大榴莲祖姥姥的大菠萝
祖宗十八代的大洋葱我拿那个筷子直接把你这个肥肉虫打飞真是气得劳资在床上打棍。
5天前 来自 湖南
0nm
5天前 来自 福建
0%%%
5天前 来自 湖南
0
问号
5天前 来自 北京
0主包主包讲一下临接表
6天前 来自 北京
0我能说我还没学吗
6天前 来自 福建
0
顶顶顶
6天前 来自 江苏
0纯手搓
6天前 来自 福建
0催更
6天前 来自 浙江
0ddd
1周前 来自 福建
0ddd
1周前 来自 浙江
0ddd
1周前 来自 浙江
0
有帮助,赞一个