C29.【C++ Cont】STL库:动态顺序表(vector容器)

ops/2025/2/2 23:01:00/

目录

vector-toc" name="tableOfContents" style="margin-left:0px">1.创建vector

1.基本用法(最常用)

2.高级用法

vector%3Cint%3E%20arr%5BN%5D%3B%E5%92%8Cvector%3Cvector%3Cint%3E%3E%20arr%3B%E6%9C%89%E5%8C%BA%E5%88%AB%E5%90%97%3F-toc" name="tableOfContents" style="margin-left:40px">问题:vector arr[N];和vector> arr;有区别吗?

2.接口

1.size

2.empty

3.begin和end

4.push_back

5.pop_back

4.front和back

5.resize

6.clear


使用动态顺序表可以直接使用STL库已封装好的vector容器(又称可变长的数组),其底层为可自动扩容的顺序表

vector" name="1.%E5%88%9B%E5%BB%BAvector">1.创建vector

先包含<vector>头文件

格式:vector<任意数据类型> 创建方式

1.基本用法(最常用)

创建一个空的int类型的可变长数组

vector<int> arr;

创建一个可以存N个元素的int类型的可变长数组(未初始化,默认每个元素都是0)

const int N = 100;
vector<int> arr(N);//注意是圆括号,不是方括号!!!

创建一个可以存N个元素的int类型的可变长数组(已初始化)

const int N = 100;
vector<int> arr(N,10);//每个元素都初始化的值都是10

用列表初始化 

vector<int> arr = {1, 2, 3, 4, 5};//第二种初始化的方式:用列表初始化

注:可以用访问数组元素的方式去访问每个元素 ,例如访问下标为x的元素:arr[x]

2.高级用法

在格式里提到过;vector<任意数据类型> 创建方式 ,< >里面可以放任意的数据类型,甚至是vector自己或其他容器

放string类

vector<string> str;

 放结构体类

	struct Node{int data;struct Node* next;};vector<Node> arr;

设置成二维数组("套娃"),可变长的数组的每一个元素存着可变长的数组

vector<vector<int>> arr;

创建N个vector(即vector数组)

const int N = 5;
vector<int> arr[N];//注意是方括号,不是圆方括号!!!

vector%3Cint%3E%20arr%5BN%5D%3B%E5%92%8Cvector%3Cvector%3Cint%3E%3E%20arr%3B%E6%9C%89%E5%8C%BA%E5%88%AB%E5%90%97%3F" name="%E9%97%AE%E9%A2%98%3Avector%3Cint%3E%20arr%5BN%5D%3B%E5%92%8Cvector%3Cvector%3Cint%3E%3E%20arr%3B%E6%9C%89%E5%8C%BA%E5%88%AB%E5%90%97%3F">问题:vector<int> arr[N];和vector<vector<int>> arr;有区别吗?

答:

2.接口

1.size

作用:返回有效元素的个数,时间复杂度为O(1)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};cout<<arr.size()<<endl;return 0;
}

运行结果

例如顺序表的遍历

void print(vector<int>& a)//传引用调用,避免拷贝
{for(int i = 0; i < a.size(); i++){cout << a[i] << " ";}
}

2.empty

作用:返回顺序表是否为空的判断结果,返回类型为bool型;如果为空,返回true;如果不为空,返回false,时间复杂度为O(1)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr;if (arr.empty()){cout<<"为空";	} else{cout<<"不为空";	} return 0;
}

运行结果

3.begin和end

当为非空表时,beign返回起始位置的迭代器(左闭);end返回最后位置的下一个位置的迭代器(右开)

使用迭代器遍历顺序表

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};//i实际类型为vector<int>::iterator,这里写auto让编译器自动推导for (auto i=arr.begin();i<arr.end();i++)cout<<*i<<" ";return 0;
}

或者使用范围for

	vector<int> arr={1,2,3,4,5};for (auto a:arr)cout<<a<<" ";

运行结果

注意不能写成cout<<arr[i]<<" ";!!!在C13.【C++ Cont】初识string类字符串的迭代器文章中讲过,访问迭代器指向的值需要解引用(*)

4.push_back

作用:尾插元素,时间复杂度为O(1)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};arr.push_back(6);for (auto a:arr){cout<<a<<" ";	} return 0;
}

运行结果

5.pop_back

作用:当为非空表时,尾删元素,时间复杂度为O(1)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};arr.pop_back();for (auto a:arr){cout<<a<<" ";	} return 0;
}

运行结果

注:insert与erase由于时间复杂度过高,竞赛中尽量不使用,这里不作详细介绍

例如283. 移动零 - 力扣(LeetCode)

移动零:

class Solution {
public:void moveZeroes(vector<int>& nums) {int s=0;vector<int>::iterator i=nums.begin();while(i<nums.end()){if ((*i)==0){nums.erase(i);s++;}else{i++;}}while(s--){nums.push_back(0);}}
};

 

4.front和back

作用:当为非空表时,front返回首元素;back返回尾元素,时间复杂度都为O(1)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};cout<<"首元素:"<<arr.front()<<endl;cout<<"尾元素:"<<arr.back()<<endl;	 return 0;
}

运行结果

5.resize

作用:修改resize的大小,可以变大可以变小

如果大于原始的大小,多出来的位置会补上默认值,一般为0;

如果小于原始的大小,相当于把后面的元素全部删掉(相当于多次尾删)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};arr.resize(10);//10为元素个数for (auto a:arr)cout<<a<<" ";arr.resize(3);cout<<endl;for (auto a:arr)cout<<a<<" ";	 return 0;
}

运行结果

6.clear

作用:清空vector,底层是遍历整个元素,一个一个删除,时间复杂度为O(N)

#include <iostream>
#include <vector>
using namespace std;
int  main()
{vector<int> arr={1,2,3,4,5};arr.clear();cout<<arr.size(); return 0;
}

运行结果


注:更多的成员函数参见cplusplus官网vector - C++ Reference


http://www.ppmy.cn/ops/155146.html

相关文章

集群建模、空地协同,无人机高效救灾技术详解

集群建模、空地协同的无人机高效救灾技术是现代应急救援领域的一项重要创新。以下是对该技术的详细解析&#xff1a; 一、集群建模技术 集群建模技术是指将多台无人机组成集群&#xff0c;通过协同作业的方式对灾区进行快速建模。这种技术能够充分利用无人机的机动性和高效性…

Linux+Docer 容器化部署之 Shell 语法入门篇 【Shell基本运算符】

文章目录 一、Shell 基本运算符二、算术运算符三、关系运算符四、布尔运算五、字符串运算符六、文件测试操作七、C Shell 操作符7.1 算术和逻辑运算符7.2 文件测试操作 八、Korn Shell 运算符8.1 算术和逻辑运算符8.2 文件测试操作 九、总结 一、Shell 基本运算符 有各种不同的…

linux 函数 sem_init () 信号量、sem_destroy()

&#xff08;1&#xff09; &#xff08;2&#xff09; 代码举例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …

[EAI-026] DeepSeek-VL2 技术报告解读

Paper Card 论文标题&#xff1a;DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding 论文作者&#xff1a;Zhiyu Wu, Xiaokang Chen, Zizheng Pan, Xingchao Liu, Wen Liu, Damai Dai, Huazuo Gao, Yiyang Ma, Chengyue Wu, Bin…

BGP分解实验·15——路由阻尼(抑制/衰减)实验

一个可以监控路由信息不稳定征兆的小特性&#xff0c;那些表现出不稳定的路由将会受到惩罚&#xff0c;直到它稳定下来为止。 实验拓扑如下&#xff1a; 配置两台路由器的基础连通性后&#xff0c;再到R2上设置半衰期5分钟、使用阈值750&#xff0c;惩罚阈值1500&#xff1b;并…

JavaScript作用域详解

前言 作用域是JavaScript中一个重要的概念&#xff0c;它决定了变量和函数在代码中的可访问性和可见性。了解JavaScript的作用域对于编写高效、可维护的代码至关重要。本文将深入介绍JavaScript作用域相关的知识点&#xff0c;其中包括作用域类型&#xff0c;作用域链&#xff…

LeetCode 2412.完成所有交易的初始最少钱数:【年度巨献】举例说明(讲明白),由难至简(手脚不乱),附Python一行版

【LetMeFly】2412.完成所有交易的初始最少钱数&#xff1a;【年度巨献】举例说明(讲明白)&#xff0c;由难至简(手脚不乱)&#xff0c;附Python一行版 文章目录 【LetMeFly】2412.完成所有交易的初始最少钱数&#xff1a;【年度巨献】举例说明(讲明白)&#xff0c;由难至简(手脚…

MySQL(导入sql文件)

传文件省略…(从windows传到linux) 改编码格式 为什么不在windows里面修改呢&#xff1f;因为windows打开发现根本打不开直接就卡住了数据过多了&#xff08;4百万数据(不信可以自己试一下)&#xff09; [rootCentOS8 ~]# file order_info.sql order_info.sql: UTF-8 Unicode…