vector容器/构造函数/赋值操作/容量和大小/插入和删除/数据存储/互换容器/预留空间

news/2024/12/20 13:18:45/文章来源:https://www.cnblogs.com/RX1Ri/p/18611133

vector基本概念
功能:
vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:
不同之处在于数组是静态空间,而vector可以动态扩展

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

vector容器的迭代器是支持随机访问的迭代器

Vector构造函数
功能描述:
创建vector容器

函数原型:

示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//vector容器构造
void test01()
{vector<int>v1; //默认构造 无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);//通过区间方式进行构造vector<int>v2(v1.begin(),v1.end());printVector(v2);//n个elem方式构造vector<int>v3(10,100);printVector(v3);//拷贝构造vector<int>v4(v3);printVector(v4);
}
int main() 
{test01();return 0;
}

总结:
vector的多种构造方式没有可比性,灵活使用即可

Vector赋值操作

示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//vector赋值
void test01()
{vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);//赋值vector<int>v2;v2=v1;printVector(v2);//assignvector<int>v3;;v3.assign(v1.begin(),v1.end());printVector(v3);//n个elem方式赋值vector<int>v4;v4.assign(10,100);printVector(v4);
}
int main() 
{test01();return 0;
}

总结:
vector赋值方式比较简单,使用operator=,或者assign都可以

Vector容量和大小

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//vector容器的容量和大小操作
void test01()
{vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);if (v1.empty())//为真 代表容器为空{cout<<"v1为空"<<endl;}else{cout<<"v1不为空"<<endl;cout<<"v1的容量为:"<<v1.capacity()<<endl;cout<<"v1的大小为:"<<v1.size()<<endl;}//重新指定大小v1.resize(15,100);//利用重载版本,可以指定默认填充值,参数2printVector(v1);//如果重新指定的比原来长 默认用 0 填充新的位置v1.resize(5);printVector(v1); //如果重新指定的比原来短了,超出部分会删除掉}
int main() 
{test01();return 0;
}

总结:
判断是否为空---empty
返回元素个数---size
返回容器容量---capacity
重新指定大小 ---resize

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(); //删除容器中所有元素

示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//vector插入和删除
void test01()
{vector<int>v1;//尾插v1.push_back(10);v1.push_back(20);v1.push_back(30);v1.push_back(40);v1.push_back(50);//遍历printVector(v1);//尾删v1.pop_back();printVector(v1);//插入 第一个参数是迭代器v1.insert(v1.begin(),100);printVector(v1);v1.insert(v1.begin(),2,1000);printVector(v1);//删除 参数也是迭代器v1.erase(v1.begin());printVector(v1);//清空v1.erase(v1.begin(),v1.end());printVector(v1);v1.clear();printVector(v1);
}
int main() 
{test01();return 0;
}

总结:
尾插---push_back
尾删---pop_back
插入---insert (位置迭代器)
删除---erase (位置迭代器)
清空---clear

vector数据存储

功能描述:
·对vector中的数据的存取操作

函数原型:

·at(int idx); //返回索引idx所指的数据

·operator[]; //返回索引idx所指的数据

·front(); //返回容器中第一个数据元素

·back(); //返回容器中最后一个数据元素

示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//vector数据存储
void test01()
{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;
}
int main() 
{test01();return 0;
}

总结:
除了用迭代器获取vector容器中元素,[]和at也可以
front返回容器第一个元素
back返回容器最后一个元素

vector互换容器
功能描述:
实现两个容器内元素进行互换

函数原型:

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

示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件//vector容器互换
void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//1、基本使用
void test01()
{vector<int>v1;for (int i = 0; i < 10; i++){v1.push_back(i);}cout<<"交换前:"<<endl;printVector(v1);vector<int>v2;for (int i = 10; i>0; i--){v2.push_back(i);}printVector(v2);cout<<"交换后:"<<endl;v1.swap(v2);printVector(v1);printVector(v2);
}
//2、实际用途
//巧用swap可以收缩内存空间
void test02()
{vector<int>v;for (int i = 0; i < 100000; i++){v.push_back(i);}cout<<"v的容量为:"<<v.capacity()<<endl;cout<<"v的大小为:"<<v.size()<<endl;v.resize(3);//重新指定大小cout<<"v的容量为:"<<v.capacity()<<endl;cout<<"v的大小为:"<<v.size()<<endl;//巧用swap收缩内存vector<int>(v).swap(v);  //匿名对象cout<<"v的容量为:"<<v.capacity()<<endl;cout<<"v的大小为:"<<v.size()<<endl;
}
int main() 
{test01();test02();return 0;
}

总结:
swap可以使两个容器互换,可以达到实用的收缩内存效果

vector预留空间

功能描述:
减少vector在动态扩展容量时的扩展次数

函数原型:
reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问
示例:

#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm> //标准算法的头文件void printVector(vector<int>&v)
{for (vector<int>::iterator it = v.begin(); it!=v.end(); it++){cout<<*it<<" ";}cout<<endl;
}
//vector容器  预留空间
void test01()
{vector<int>v;//利用reserve预留空间v.reserve(100000);int num=0;   //统计开辟次数int*p=NULL;for (int i = 0; i < 100000; i++){v.push_back(i);if (p!=&v[0]){p=&v[0];num++;}       }cout<<"num="<<num<<endl;
}int main() 
{test01();return 0;
}

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

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

相关文章

Win11系统如何更改为Win10右键菜单样?Win11系统更改为Win10右键菜单样式方法

Win11系统更改为Win10右键菜单样式方法: 1、按“Win+X”或者鼠标右键点击“开始”菜单,打开“终端管理员”。如下图:2、在命令输入下方命令: reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve3、按“Enter(…

manim边学边做--旋转

本篇介绍Manim中的两个旋转类的动画,名称差不多,分别是Rotate和Rotating。 Rotate类主要用于对图形对象进行指定角度、围绕特定点的精确旋转,适用于几何图形演示、物理模拟和机械运动展示等场景; Rotating类则侧重于创建让对象围绕指定轴或点持续旋转的动画,用于动态图标、…

【日记】什么叫做偷感十足哈哈哈哈哈哈哈哈哈(962 字)

正文今天只有一件比较有意思的事情。晚上应酬,提前庆祝冬至,吃的羊肉汤。我也不知道为什么自上了大学之后,去过的每一个地方都很重视冬至。或许因为快过年了?行领导,市分行检查组,还有一个客户。分了两桌,底层员工一桌,领导和客户一桌。来了三个人来我们这打圈…… 酒过…

博弈论+ybt题解

NIM游戏及其证明 题目描述即为T1,不多赘述有向图游戏及SG函数而对于由\(n\)个有向图游戏组成的组合游戏,设它们的起点分别为\(S_1, S_2, \ldots, S_n\),则有定理: 当且仅当\(\text{SG}(s_1) \oplus \text{SG}(s_2) \oplus \ldots \oplus \text{SG}(s_n) \neq 0\)时,这个游…

MapperScannerConfigurer 配置出错造成没有读取 db.properties 文件中的数据库连接参数

MyBatis 和 Spring 集成中,MapperScannerConfigurer 配置出错造成没有读取 db.properties 文件中的数据库连接参数,进而加载不到正确的 JDBC 驱动,本文记录了问题表现和问题分析。MyBatis-Spring 实现 MyBatis 和 Spring 框架集成。 问题现象 在配置中碰到不能加载 MySQL JD…

聊一聊坑人的 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下来…

如何提高测试过程效率?

前几天写了一篇文章,分享了一些工作汇报的方法和案例,详情见《如何编写年度工作汇报PPT》。 后台有同学留言,对质量度量和测试提效部分提了几个问题,核心集中在如何提高测试过程效率方面。 我在前面写过几篇关于测试提效的文章,分别聊到了影响测试效率的因素,测试团队要提…

真保姆级——在VMware的Ubuntukylin上进行Hadoop单机_伪分布式安装时安装VMware_Tools后虚拟机与物理机之间无法传输文件和复制粘贴的问题(附Ubuntu更改默认登录用户)

目录一、前言二、版本信息三、hadoop用户创建1.创建hadoop用户2.在创建hadoop用户后对系统进行重启四、解决办法4.1 更改默认登陆用户4.2 安装VMware Tools4.3 验证VMware Tools是否安装成功4.4 KO!!!4.4.1 卸载安装的Vmware Tools4.4.2 安装VMware Tools所需的组件五、可能…

菱形计数与最值问题

菱形计数与最值问题题面你有一个边长为 \(n\) 的正六边形。它被划分成了若干个边长为 \(1\) 的小等边三角形。 我们希望通过合并若干对有公共边的三角形,把这个六边形变成若干个边长为 \(1\) 的菱形的划分。对于每对三角形之间,它们合并有一个代价,问最小的总代价是多少。 例…

钉钉机器人 自动化发版

开发机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部署钉钉机器人 自动化发版 #1 简介开发机器人接收消息并调用构建接口, 实现自动化发版 发送指令 -> 机器人接收指令 -> 调用jenkins-job远程构建与部…

ChCore-Lab4

lab 4: 多核调度与IPC 结合IPADS OS Lab Manual一起阅读,风味更佳!多核启动支持:使ChCore通过树莓派厂商所提供的固件唤醒多核执行 多核调度: 使ChCore实现在多核上进行round-robin调度。 IPC:使ChCore支持进程间通信 IPC调优:为ChCore的IPC针对测试的特点进行调优。踩坑1…

DNS 服务器是什么?有什么作用?

DNS 服务器是什么?有什么作用 一、DNS 服务器的定义 DNS 服务器即域名系统(Domain Name System)服务器。它是一种在互联网基础设施中扮演关键角色的服务器。在互联网的世界里,每台设备(如服务器、计算机等)都有一个唯一的 IP 地址,就像每部电话都有一个电话号码一样。但…