C++中的vector容器

news/2024/11/28 19:30:59/

一.  基本概念

1. 包含在头文件 #include <vector>
2. 功能: 模拟了一个动态数组
3. 底层实现
首先开辟一定大小的数组 随着元素的增加,如果空间不够之后 自动采取扩容机制 -> 自增长
扩容规则:以原空间大小的 2 倍重新开辟一块空间 将就空间的元素挪到新空间上 在继续添加元素,一直遵循每次扩容大小是原空间大小的2 倍。
4. 常用函数接口 vector 常用接口 vector<int> vec; 由于 vector 底层是一个数组 ,所以其内存是连续的,可以采取下标访问方式。对于数组来说 尾插和尾删的时间复杂度为O(1) ; 对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)
5.vector 初始化方式
vector <int> vec1;//默认方式初始化底层没有为其分配内存空间
vector <int> vec2(10);//指定了刚开始的容量为10,默认值为0
//含有 8 个素数的 vector 容器
vector <int> primes {2, 3, 5, 7, 11, 13, 17, 19};
vector <int> vec3(10,20);//指定了开始的容量10和每个格子的默认值为20

二.vector常用操作 

v.capacity(); // 容器容量
v.size(); // 容器大小
vec.max_size()// 表示返回 vector 最大容量
v.at(int idx); // 用法和 [] 运算符相同
v.push_back(); // 尾部插入
v.pop_back(); // 尾部删除
v.front(); // 获取头部元素
v.back(); // 获取尾部元素
v.begin(); // 头元素的迭代器
v.end(); // 尾部元素的迭代器
v.insert(pos,elem); //pos vector 的插入元素的位置
v.insert(pos, n, elem) // 在位置 pos 上插入 n 个元素 elem
v.erase(pos); // 移除 pos 位置上的元素,返回下一个数据的位置
v.erase(begin, end); // 移除 [begin, end) 区间的数据,返回下一个元素的位置
reverse(pos1, pos2); // vector 中的 pos1~pos2 的元素逆序存储

示例1:容器的初始化方式

#include <iostream>
#include <vector>//向量容器的头文件
using namespace std;
int main () {//1.默认方式初始化底层没有为其分配内存空间vector<int> v;//2.指定了刚开始的容量为10,默认值为0vector<int> v1(10);//输出容器中元素的值 v1.size()获取元素的个数for(int i =0;i<v1.size();i++){//对[] 的重载函数cout<<v1[i]<<endl;}//3.指定了刚开始的容量为10,初始化2vector<int> v2(10,2);for(int i =0;i<v1.size();i++){//对[] 的重载函数cout<<v2[i]<<endl;}//4.调用拷贝构造函数,用同类型已经存在的对象构造同类型的vector<int> v3(v2);//5. CONFIG += c++11vector<int> v4 {1,2,3,4,5};for(int i =0;i<v4.size();i++){//对[] 的重载函数cout<<v4[i]<<endl;}return 0;
}

示例2:插入数据 push_back()

#include <iostream>
#include <vector>
using namespace std;
int main()
{//1.创建容器vector<int> v;//保存整型数据//2.添加数据 模板类中的成员函数v.push_back(10);//尾插v.push_back(12);v.push_back(13);v.push_back(14);v.push_back(16);v[2] = 521;//修改对应角标位置的元素值 operator[] 函数的返回值是T&//3.获取 输出 v.size()获取元素的个数for(int i=0; i< v.size(); i++)cout<<v[i]<<" ";cout<<endl;return 0;
}

示例3:查找元素 [] at(pos)

//3.获取元素
cout<<v[1]<<endl;// 20
//运算符重载[] 返回值为T&
v[1] = 521;
cout<<v[1]<<endl;
cout<<v1.at(1)<<endl;

示例4:获取元素

int main()
{vector<int> v1;for(int i=0;i<10;i++)v1.push_back(i);//获取头部元素cout<<v1.front()<<endl;//获取尾部元素cout<<v1.back()<<endl;//尾部删除v1.pop_back();for(int i=0;i<v1.size();i++)cout<<v1[i]<<endl;return 0;
}

 结语

以上就是vector容器的基本使用,后续还会分享C++容器有关知识。

最后的最后,还请大家点点赞,点点关注,谢谢大家!


http://www.ppmy.cn/news/1418547.html

相关文章

Spring中基于事件监听驱动 和 线程池的异步任务

文章目录 事件监听驱动 与 异步事件源ApplicationContextAware接口 发布事件事件实体监听事件实现异步注入綫程池 事件驱动机制&#xff0c;与MQ消息队列比较 事件监听驱动 与 异步 事件监听驱动优点&#xff1a;解耦&#xff0c;将 事件和业务进行解耦&#xff0c;通过Asyc注解…

FMix: Enhancing Mixed Sample Data Augmentation 论文阅读

1 Abstract 近年来&#xff0c;混合样本数据增强&#xff08;Mixed Sample Data Augmentation&#xff0c;MSDA&#xff09;受到了越来越多的关注&#xff0c;出现了许多成功的变体&#xff0c;例如MixUp和CutMix。通过研究VAE在原始数据和增强数据上学习到的函数之间的互信息…

带头节点单向非循环链表的基本操作(c语言实现)

头节点 头节点是数据结构中的一个概念&#xff0c;特别是在链表结构中。 它通常被设置为链表的第一个节点之前的一个节点&#xff0c;其数据域一般不存储链表中的实际数据&#xff0c;而它的指针域则存储指向链表中第一个实际节点的指针。 头节点的主要作用如下&#xff1a;…

【HTML】HTML简介

参考资料&#xff1a;https://html.spec.whatwg.org/#introduction 在最初的五年&#xff08;1990-1995&#xff09;中&#xff0c;HTML经历了一系列修订和扩展&#xff0c;最初主要由欧洲核子研究组织&#xff08;CERN&#xff09;托管&#xff0c;随后由互联网工程任务组&am…

Java中的消息队列(如RabbitMQ、Kafka)是如何工作的?

消息队列&#xff08;Message Queue&#xff09;是一种通信方法&#xff0c;其中消息发送者和接收者通过队列进行异步通信。在Java中&#xff0c;有许多消息队列系统&#xff0c;如RabbitMQ、Kafka等&#xff0c;它们各自有自己的特点和适用场景。这里尽量以一种通用的方式解释…

nodejs安装常用命令

安装 Node.js 后&#xff0c;你可以在命令行中使用以下常用命令&#xff1a; node&#xff1a;启动 Node.js 的交互式解释器&#xff0c;可以直接在命令行中执行 JavaScript 代码。 npm install <package-name>&#xff1a;安装一个 Node.js 模块&#xff0c;<packag…

数据结构与算法的经典问题 — 背包问题

数据结构与算法 数据结构与算法是计算机科学中的两个核心概念&#xff0c;它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式&#xff0c;它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…

服务器主机关机重启告警

提取时间段内系统操作命名&#xff0c;出现系统重启命令&#xff0c;若要出现及时联系确认 重启命令&#xff1a; reboot / init 6 / shutdown -r now&#xff08;现在重启命令&#xff09; 关机命令&#xff1a; init 0 / shutdown -h now&#xff08;关机&#…