STL常用容器(vector容器)---C++

STL常用容器目录

  • 2.vector容器
    • 2.1 vector基本概念
    • 2.2 vector构造函数
    • 2.3 vector赋值操作
    • 2.4 vector容量和大小
    • 2.5 vector插入和删除
    • 2.6 vector数据存取
    • 2.7 vector互换容器
      • 2.7.1 vector互换容器收缩内存空间
    • 2.8 vector预留空间

在这里插入图片描述

2.vector容器

2.1 vector基本概念

功能:

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

vector与普通数组区别:

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

动态扩展:

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
  • vector容器的迭代器是支持随机访问的迭代器。
    在这里插入图片描述
    里面是vector的迭代器,如:begin()、end()、rend()-指向第一个元素的前一个位置、front()-返回第一个元素、back()-返回最后一个元素、insert()-插入一个元素、rbegin()-返回一个指向向量最后一个元素的反向迭代器、push_back()和pop_back()-尾插和尾删。

2.2 vector构造函数

功能描述:

  • 创建vector容器
  • 头文件:#include

函数原型:

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

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test01()
{vector<int> v1; //无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);//将v[begin(), end())区间中的元素拷贝给本身vector<int> v2(v1.begin(), v1.end());printVector(v2);//构造函数将10个100拷贝给本身vector<int> v3(10, 100);printVector(v3);vector<int> v4(v3);//拷贝构造printVector(v4);
}

在这里插入图片描述

2.3 vector赋值操作

函数原型:

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

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test02()
{vector<int> v1; //无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);vector<int> v2=v1;//等号重载printVector(v2);//将v[begin(), end())区间中的元素拷贝给本身vector<int> v3;v3.assign(v1.begin(), v1.end());printVector(v3);//构造函数将10个100拷贝给本身vector<int> v4;v4.assign(10, 99);printVector(v4);
}

在这里插入图片描述

2.4 vector容量和大小

功能描述:

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

函数原型:

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

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test03()
{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;}//resize 重新指定大小 ,若指定的更大,默认用0填充新位置,可以利用重载版本替换默认填充v1.resize(15, 10);printVector(v1);//resize 重新指定大小 ,若指定的更小,超出部分元素被删除v1.resize(5);printVector(v1);
}

在这里插入图片描述
可见,容量开辟的会比实际所需大小大一点。

总结:

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

2.5 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(); //删除容器中所有元素
  • 注: 此处的位置均为迭代器指向的位置。

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test04()
{vector<int> v1; //无参构造for (int i = 1; i < 6; i++){//尾插v1.push_back(i*10);}printVector(v1);//尾删v1.pop_back();printVector(v1);//插入v1.insert(v1.begin(), 9);//从第一个元素位置开始,插入9printVector(v1);v1.insert(v1.begin(), 2, 99);//从第一个元素位置开始,插入2个99printVector(v1);//删除v1.erase(v1.begin());//只删除第一个元素printVector(v1);//清空v1.erase(v1.begin(), v1.end());//删除从begin指向的位置到end指向的位置之间内容v1.clear();//效果同上,清空printVector(v1);
}

在这里插入图片描述
总结

  • 尾插 — push_back
  • 尾删 — pop_back
  • 插入 — insert (位置迭代器)
  • 删除 — erase (位置迭代器)
  • 清空 — clear

2.6 vector数据存取

函数原型:

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

示例:

void printVector(vector<int>& v) {for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;
}
void test05()
{vector<int> v1; //无参构造for (int i = 1; i < 6; i++){//尾插v1.push_back(i*10);}printVector(v1);for (int i = 0; i < v1.size(); i++){cout << v1.at(i) << " ";}cout << endl;cout << "v1的第一个元素为: " << v1.front() << endl;cout << "v1的最后一个元素为: " << v1.back() << endl;
}

在这里插入图片描述
总结:

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

2.7 vector互换容器

功能描述:

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

函数原型:

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

示例:

void printVector(vector<int>& v) {	for (int i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl; 
}
void test06()
{vector<int> v1; //无参构造for (int i = 1; i < 10; i++){//尾插v1.push_back(i*10);}printVector(v1);vector<int> v2; //无参构造for (int i = 1; i < 10; i++){//尾插v2.push_back(i *9);}printVector(v2);//互换容器cout << "互换后:" << endl;v1.swap(v2);printVector(v1);printVector(v2);
}

在这里插入图片描述

2.7.1 vector互换容器收缩内存空间

  • 巧用swap收缩内存
    示例:
void test07()
{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;//收缩内存vector<int>(v).swap(v); //匿名对象:执行完当前行就回收cout << "v的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;
}

在这里插入图片描述
析:vector(v).swap(v);
其中vector(v)表示创建一个匿名对象,其大小和容量按照v的实际大小进行初始化(即为什么交换后v的大小和容量都为3)。

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

2.8 vector预留空间

功能描述:

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

函数原型:

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

示例:

void test08()
{vector<int> v;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 << "v的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;cout << "空间开辟了" << num << "次" << endl;
}

在这里插入图片描述
可见,对于大空间vector的开辟不是一下子就开辟的,他是一个逐步个过程。
当提前预置空间容量时,就只会开辟一次。如下:
在这里插入图片描述
总结:如果数据量较大,可以一开始利用reserve预留空间.

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

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

相关文章

自然语言处理(NLP)—— 神经网络自然语言处理(2)实际应用

本篇文章的第一部分是关于探索词嵌入&#xff08;word embedding&#xff09;向量空间。词嵌入是一种语言模型和文本表示技术&#xff0c;其中单词或短语从词汇表被映射到向量的高维空间中。通过这种方式&#xff0c;可以通过计算向量之间的距离来捕捉单词之间的语义关系。 1.…

2024-02-23(Spark)

1.RDD的数据是过程数据 RDD之间进行相互迭代计算&#xff08;Transaction的转换&#xff09;&#xff0c;当执行开启后&#xff0c;代表老RDD的消失 RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见了。 这个特性可以最大化…

R语言空间分析、模拟预测与可视化

随着地理信息系统&#xff08;GIS&#xff09;和大尺度研究的发展&#xff0c;空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用&#xff0c;其中在空间分析方面扮演着重要角色&#xff0c;与空间相关的包的数量也达到130多个。在本…

搜维尔科技:第九届元宇宙数字人大赛,参赛小组报名确认公告

各位参赛选手大家好&#xff0c;近期已收到新增报名信息如下表&#xff0c;请各位参赛选手确认&#xff0c;如果信息有误或信息不完整请电话联系赛务组工作人员进行更正 随着元宇宙时代的来临&#xff0c;数字人设计成为了创新前沿领域之一。为了提高大学生元宇宙虚拟人角色策划…

uniapp实现单选框

采用uniapp-vue3实现的一款单选框组件&#xff0c;提供丝滑的动画选中效果&#xff0c;支持不同主题配置&#xff0c;适配web、H5、微信小程序&#xff08;其他平台小程序未测试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.dcloud.net…

SpringBoot实现缓存预热方案

缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。 那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系统呢? 实现方案概述 在 Spring Boot 启动之后,可以通过以下手段实现缓存预热: 使用…

数据界的达克摩斯之剑----深入浅出带你理解网络爬虫(First)

目录 一.引言 二.网络爬虫产生的背景 三.爬虫背后的相关技术和原理 1.插入URL的概念解析 2.常见的几种URL格式 四.网络爬虫的分类 1.通用网络爬虫 2.增量式网络爬虫 3.Deep Web爬虫 一.引言 网络爬虫是一种自动获取网页内容的程序或技术。它就像一只“小蜘蛛”&#x…

Java设计模式 | 七大原则之依赖倒转原则

依赖倒转原则&#xff08;Dependence Inversion Principle&#xff09; 基本介绍 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖其抽象&#xff08;接口/抽象类&#xff09;抽象不应该依赖细节&#xff0c;细节应该依赖抽象依赖倒转&#xff08;倒置&#xff09;的…

Redis 16种妙用

1、缓存 2、数据共享分布式 3、分布式锁 4、全局ID 5、计数器 6、限流 7、位统计 8、购物车 9、用户消息时间线timeline 10、消息队列 11、抽奖 12、点赞、签到、打卡 13、商品标签 14、商品筛选 15、用户关注、推荐模型 16、排行榜 1、缓存 String类型 例如&#xff1a;热点…

《TCP/IP详解 卷一》第8章 ICMPv4和ICMPv6

目录 8.1 引言 8.1.1 在IPv4和IPv6中的封装 8.2 ICMP 报文 8.2.1 ICMPv4 报文 8.2.2 ICMPv6 报文 8.2.3 处理ICMP报文 8.3 ICMP差错报文 8.3.1 扩展的ICMP和多部报文 8.3.2 目的不可达和数据包太大 8.3.3 重定向 8.3.4 ICMP 超时 8.3.5 参数问题 8.4 ICMP查询/信息…

猫头虎分享已解决Bug || Invariant Violation: Element type is invalid

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

oracle官网下载早期jdk版本

Java Downloads | Oracle JDK Builds from Oracle 以上压缩版&#xff0c;以下安装版 Java Downloads | Oracle 该链接往下拉能看到jdk8和jdk11的安装版 -- end

Vue源码系列讲解——生命周期篇【七】(模板编译阶段)

目录 1. 前言 2. 模板编译阶段分析 2.1 两种$mount方法对比 2.2 完整版的vm.$mount方法分析 3. 总结 1. 前言 前几篇文章中我们介绍了生命周期的初始化阶段&#xff0c;我们知道&#xff0c;在初始化阶段各项工作做完之后调用了vm.$mount方法&#xff0c;该方法的调用标志…

二 线性代数-向量

1、向量的表示方法&#xff1a; 其中的 i、j、k是坐标轴方向的单位向量。 2、向量的模&#xff1a; 用坐标计算的方法&#xff1a; 3、向量的运算&#xff1a; 3.1 向量的加法减法&#xff1a; 3.2 向量的数乘&#xff1a; 拉格朗日乘数法的 基础 公式。 3.3 向量的数量积&a…

计算机网络-后退N帧协议(弊端 滑动窗口 运行中的GBN 滑动窗口长度习题 GBN协议性能分析 )

文章目录 停等协议的弊端后退N帧协议中的滑动窗口GBN发送方必须响应的三件事GBN接受方要做的事运行中的GBN滑动窗口长度GBN协议重点总结习题1习题2GBN协议性能分析小结 停等协议的弊端 信道利用率低&#xff1a;在停等协议中&#xff0c;发送方在发送完一帧后必须等待接收方确…

List去重有几种方式

目录 1、for循环添加去重 2、for 双循环去重 3、for 双循环重复坐标去重 4、Set去重 5、stream流去重 1、for循环添加去重 List<String> oldList new ArrayList<>();oldList.add("张三");oldList.add("张三");oldList.add("李四&q…

基于python-socket构建任务服务器(基于socket发送指令创建、停止任务)

在实现ia业务服务器时需要构建一个python-socket客户端&#xff0c;1、要求能与服务器保持心跳连接&#xff0c;每10秒钟发送一次心跳信号&#xff1b;2、要求能根据socket服务器发送的指令创建或终止一个定时任务。 为此以3个类实现该功能&#xff0c;分别为socket通信类&…

成功解决SyntaxError: unexpected character after line continuation character

成功解决SyntaxError: unexpected character after line continuation character &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &…

蓝桥杯Learning

Part 1 递归和递推 1. 简单斐波那契数列 n int(input())st [0]*(47) # 注意这个地方&#xff0c;需要将数组空间设置的大一些&#xff0c;否则会数组越界 st[1] 0 st[2] 1 # 这个方法相当于是递推&#xff0c;即先求解一个大问题的若干个小问题 def dfs(u):if u 1:print(…

Object中的hashCode()

让hashcode方法的返回值为地址 vm参数中输入-XX:UnlockExperimentalVMOptions -XX:hashCode4&#xff0c;如下图&#xff1a; 参考 搞懂JAVAObject中的hashCode()_java_脚本之家 JDK核心JAVA源码解析(9) - hashcode 方法 - 知乎