STL——vector详解

目录

💡基本概念

💡存放内置数据类型

💡存放自定义数据类型

💡存放自定义数据类型指针

💡vector容器嵌套容器

💡vector构造函数

💡vector赋值操作

💡vector容量和大小

💡vector插入和删除

💡vector数据存取

💡vector互换容器

💡 基本使用

💡 实际应用

💡vector预留空间


💡基本概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间

💡存放内置数据类型

容器:         vector
算法:        for each
迭代器:        vector<int>::iterator

💡存放自定义数据类型

class person
{
public:person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};

	vector<Person>v;//向容器中添加数据Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);v.push_back(p1);v.push_back(p2);v.push_back(p3);

💡存放自定义数据类型指针

💡vector容器嵌套容器

类似于二维数组

	vector<vector<int>>v;//创建小容器vector<int>v1;vector<int>v2;vector<int>v3;

	//添加数据for (int i = 0; i < 4; i++){v1.push_back(i + 1);v2.push_back(i + 2);v3.push_back(i + 3);}//将小容器插入到大容器v.push_back(v1);v.push_back(v2);v.push_back(v3);

💡vector构造函数

功能描述:

  • 创建vector容器

函数原型:

  • vector<T> v;   //采用模板实现类实现,默认构造函数
  • vector(v.begin(),v.end());  //将v[begin(),end0)区间中的元素拷贝给本身。
  • vector(n, elem);    //构造函数将n个elem拷贝给本身
  • vector(const vector &vec);   //拷贝构造函数

	vector<int> v1;//默认构造,无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}Print(v1);//通过区间的方式构造vector<int>v2(v1.begin(), v1.end());Print(v2);//n个elem构造vector<int>v3(10, 100);//10个100Print(v3);//拷贝构造vector<int>v4(v1);Print(v4);

💡vector赋值操作

功能描述:

  • 给vector容器进行赋值

函数原型:

  • vector& operator=(const vector &vec);    //重载等号操作符
  • assign( beg, end);   //将[beg,end)区间中的数据拷贝赋值给本身
  • assign(n, elem);    //将n个elem拷贝赋值给本身

	vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}Print(v1);//赋值vector<int>v2;v2 = v1;Print(v2);//assignvector<int>v3;v3.assign(v1.begin(), v1.end());Print(v3);//n个elemvector<int>v4;v4.assign(10, 100);//10个100Print(v4);

💡vector容量和大小

功能描述:

  • 对vector容器的容量和大小操作

函数原型:

  • empty();   //判断容器是否为空
  • capacity();   //容器的容量
  • size();    //返回容器中元素的个数
  • resize(int num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
  • resize(int num, elem);     
    //重新指定容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则未尾超出容器长度的元素被删除

	vector<int>v1;cout << "赋值前v1的容量是:" << v1.capacity() << endl;for (int i = 0; i < 10; i++){v1.push_back(i);}Print(v1);if (v1.empty())//为真,代表容器为空{cout << "为空" << endl;}else{cout << "不为空" << endl;cout << "赋值后v1的容量是:" << v1.capacity()<< endl;//capacity>=size,size是容器内的元素个数cout << "v1的大小是:" << v1.size()<<endl;}//重新指定大小v1.resize(15);Print(v1);//如果重新指定的大小比原来大,默认用0来填充新增的空间v1.resize(16, 100);Print(v1);//可以指定填充数v1.resize(5);//如果重新指定的大小比原来小,则会删除多余的部分Print(v1);

💡vector插入和删除

功能描述:

  • 对vector容器进行插入、删除操作

函数原型:

  • push back(ele);    //尾部插入元素ele
  • pop_back();     //删除最后一个元素
  • insert(const iterator pos, ele);     //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos,int count,ele); //迭代器指向位置pos插入count个元素ele
  • erase(const iterator pos);      //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end);  //删除选代器从start到end之间的元素
  • clear();       //删除容器中所有元素

	vector<int>v1;//尾插for (int i = 0; i < 10; i++){v1.push_back(i);}v1.push_back(100);Print(v1);//尾删v1.pop_back();//删除100Print(v1);//插入v1.insert(v1.begin(), 100);//参数1是迭代器,参数2是要插入的元素,插入在指定位置之前Print(v1);v1.insert(v1.begin(), 2, 1000);//插入2个1000Print(v1);//删除v1.erase(v1.begin());//删除第一个1000 (参数也是迭代器)Print(v1);v1.erase(v1.begin(), v1.begin() + 3);Print(v1);//清空v1.clear();Print(v1);

💡vector数据存取

功能描述:

  • 对vector中的数据的存取操作

函数原型:

  • at(iht idx);  //返回索引idx所指的数据
  • operator[];   //返回索引idx所指的数据
  • front();            //返回容器中第一个数据元素
  • back();       //返回容器中最后一个数据元素

	vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}//利用[]的方式来访问数组元素for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//利用at访问for (int i = 0; i < v1.size(); i++){cout << v1.at(i) << " ";}cout << endl;//获取第一个元素cout << v1.front() << endl;//获取最后一个元素cout << v1.back() << endl;

💡vector互换容器

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec);        // 将vec与本身的元素互换

💡 基本使用

	//基本使用vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}cout << "交换前:" << endl;Print(v1);vector<int>v2;for (int i = 10; i < 20; i++){v2.push_back(i);}Print(v2);cout << "交换后:" << endl;v1.swap(v2);Print(v1);Print(v2);

💡 实际应用

	//实际用途//巧用swap收缩内存空间vector<int>v;for (int i = 0; i < 10000; i++){v.push_back(i);}cout << "capacity:" << v.capacity() << endl;cout << "size:" << v.size() << endl;v.resize(3); //重新指定大小,size变小之后,capacity不变cout << "capacity:" << v.capacity() << endl;cout << "size:" << v.size() << endl;//巧用swap收缩内存vector<int>(v).swap(v);cout << "capacity:" << v.capacity() << endl;cout << "size:" << v.size() << endl;

💡vector预留空间

功能描述:

  • 减少vector在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len);         //容器预留len个元素长度,预留位置不初始化,元素不可访问

	vector<int>v;//利用reserve预留空间v.reserve(10000);int cnt = 0;//统计开辟空间的次数int* p = NULL;for (int i = 0; i < 10000; i++){v.push_back(i);if (p != &v[0])//每次重新开辟扩容时,会找到一块新的空间,对应一个新的地址{p = &v[0];cnt++;}}cout << "cnt=" << cnt << endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336753.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vulhub中的Nginx漏洞的详细解析

Nginx漏洞 1.cd到nginx_parsing_vulnerability cd /opt/vulhub/nginx/nginx_parsing_vulnerability 2.执行docker-compose up -d 3.查看靶场是否开启成功 dooker ps 4.访问浏览器 因为这里是80端口所以直接使用ip就能访问成功 5.上传图片 注意这里的图片是含有一句话木马的图…

MySQL8下载安装教程

一、MySQL下载 我的版本是8.2.0&#xff0c;当前的最新版本&#xff0c;网址如下&#xff1a;MySQL :: Download MySQL Community Server 点击No thanks&#xff0c;just start my download&#xff0c;就是只是开始下载的意思&#xff0c;点击下载&#xff0c;等待下载完成 二…

PLECS如何下载第三方库并导入MOSFET 的xml文件,xml库路径添加方法及相关问题

1. 首先xml库的下载&#xff0c;PLECS提供了一个跳转的链接。 https://www.plexim.com/download/thermal_models 2. 下载一个库&#xff08;以最后一个Wolfspeed为例&#xff0c;属于CREE的SiC MOSFET&#xff09; 下载这个就行&#xff0c;都包含了。不信自己可以试试再下载…

Docker安装Jenkins,配置Maven和Java

前言 这是一个java的springboot项目&#xff0c;使用maven构建 安装准备 需要将maven和jdk安装在服务器上&#xff0c;Jenkins需要用到&#xff0c;还有创建一个jenkins的目录&#xff0c;安装命令如下&#xff1a; docker run -d -uroot -p 9095:8080 -p 50000:50000 --n…

6款实用的Git可视化管理工具

前言 俗话说得好“工欲善其事&#xff0c;必先利其器”&#xff0c;合理的选择和使用可视化的管理工具可以降低技术入门和使用门槛。我们在团队开发中统一某个开发工具能够降低沟通成本&#xff0c;提高协作效率。今天给大家分享6款实用的Git可视化管理工具。 Git是什么&…

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具&#xff0c;用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体&#xff0c;能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

linux项目部署(jdk,tomcat,mysql,nginx,redis)

打开虚拟机&#xff0c;与连接工具连接好&#xff0c;创建一个文件夹 cd /tools 把jdk,tomcat安装包放入这个文件夹里面 jdk安装 #解压 tar -zxvf apache-tomcat-8.5.20.tar.gz #解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 编辑jdk文件以及测试jdk安装 第一行代码路径…

Matlab 分段函数(piecewise)

语法 pw piecewise(cond1,val1,cond2,val2,...) pw piecewise(cond1,val1,cond2,val2,...,otherwiseVal)描述 pw piecewise(cond1,val1,cond2,val2,...) 返回分段表达式或函数pw&#xff0c;当cond1为True时&#xff0c;其值为val1&#xff0c;当cond2为True时&#xff0…

实现LCM在docker之间的通信

目录 1.docker容器互联 新建网络 连接容器 2.设置环境变量 3.在两个docker之间实现通信 1.docker容器互联 新建网络 $ docker network create -d bridge test-net 连接容器 运行一个容器并连接到新建的 test-net 网络: $ docker run -itd --name lcm_1 --network tes…

UltraScale 和 UltraScale+ 生成已加密文件和已经过身份验证的文件

注释 &#xff1a;如需了解更多信息&#xff0c;请参阅《使用加密和身份验证确保 UltraScale/UltraScale FPGA 比特流的安全》 (XAPP1267)。 要生成加密比特流&#xff0c;请在 Vivado IDE 中打开已实现的设计。在主工具栏中&#xff0c;依次选择“Flow” → “Bitstream Setti…

VMware虚拟机安装Ubuntu

准备:Ubuntu的镜像文件,VMware,手. 1.新建虚拟机&#xff0c;选择自定义&#xff0c;下一步。 2.硬件兼容性&#xff0c;选择Workstation 16.x&#xff0c;下一步。 3.选择安装程序光盘映像文件&#xff0c;路径为映像文件所在文件夹&#xff0c;下一步。 4. 创建用户和设置密…