【C++】:vector容器的基本使用

目录

  • 🍒1,vector的介绍
  • 🍒2,vector的使用
    • 🐯2.1 vector的构造
    • 🦁2.2 vector iterator 的使用
    • 🌽2.3 vector 空间增长问题
    • 🍓2.4 vector 增删查改
    • 🐯2.5 vector 访问及遍历
    • 🦊2.6 vector实例化string类的初始化形式
    • 🌴2.7 sort算法的使用

🍒1,vector的介绍

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

🍒2,vector的使用

vector学习时一定要学会查看文档:vector的文档介绍vector在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了哪些接口是要重点掌握的。

注意:使用vector要包含 < vector >

🐯2.1 vector的构造

我们先介绍使用两个重点的构造使用,其余两个在下一篇模拟实现的文章中会涉及。

在这里插入图片描述

代码演示:

void TestVector1()
{//无参构造vector<int> v1; //构造并用4个100初始化vector<int> v2(4, 100);//拷贝构造vector<int> v4(v3); //用迭代区间初始化                      vector<int> v3(second.begin(),second.end());}

🦁2.2 vector iterator 的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码演示:

void TestVector2()
{// 使用push_back插入4个数据vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);// 使用迭代器进行遍历打印vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;// 使用迭代器进行修改it = v.begin();while (it != v.end()){*it *= 2;++it;}// 使用反向迭代器进行遍历再打印// vector<int>::reverse_iterator rit = v.rbegin();auto rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";++rit;}cout << endl;PrintVector(v);
}

🌽2.3 vector 空间增长问题

在这里插入图片描述

代码演示1:

reisze(size_t n, const T& data = T())
将有效元素个数设置为n个,如果时增多时,增多的元素使用data进行填充。
注意:resize在增多元素个数时可能会扩容

void TestVector3()
{vector<int> v;//插入一些数据for (int i = 1; i < 10; i++)v.push_back(i);v.resize(5);v.resize(8, 100);v.resize(12);cout << "v contains:";for (size_t i = 0; i < v.size(); i++)cout << ' ' << v[i];cout << '\n';
}

代码演示2:

往vecotr中插入元素时,如果大概已经知道要存放多少个元素,可以通过reserve方法提前将容量设置好,避免边插入边扩容效率低。

void TestVectorExpandOP()
{vector<int> v;size_t sz = v.capacity();//提前将容量设置好,可以避免一遍插入一遍扩容v.reserve(100);   cout << "making bar grow:\n";for (int i = 0; i < 100; ++i) {v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}

注意:

  1. capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。
    这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
  2. reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  3. resize在开空间的同时还会进行初始化,影响size。

🍓2.4 vector 增删查改

在这里插入图片描述

注意:insert和erase会涉及迭代器失效问题,这个问题比较复杂,将在vector的模拟实现里介绍。

代码演示1:

// 尾插和尾删:push_back/pop_back
void TestVector4()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);auto it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;v.pop_back();v.pop_back();it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;
}

代码演示2:

注意find不是vector自身提供的方法,是STL提供的算法。

// 任意位置插入:insert和erase,以及查找find
void test_vector4()
{vector<int> v1;v1.push_back(1);v1.push_back(25);v1.push_back(12);for (auto e : v1){cout << e << " ";}cout << endl;v1.insert(v1.begin(), 0);//头插for (auto e : v1){cout << e << " ";}cout << endl;v1.erase(v1.begin());//头删for (auto e : v1){cout << e << " ";}cout << endl;v1.insert(v1.begin() + 2, 50);//在中间位置插for (auto e : v1){cout << e << " ";}cout << endl;int x;cin >> x;//没有x就不插入,有x在它前面插入//find是算法里的函数 vector<int>::iterator pos = find(v1.begin(), v1.end(), x);if (pos != v1.end()){v1.insert(pos, 1000);}for (auto e : v1){cout << e << " ";}cout << endl;
}

🐯2.5 vector 访问及遍历

// operator[]+index 和 C++11中vector的新式for+auto的遍历
// vector使用这两种遍历方式是比较便捷的。
void TestVector6()
{vector<int> v{ 1, 2, 3, 4 };// 通过[]读写第0个位置。v[0] = 10;cout << v[0] << endl;// 1. 使用for+[]方式遍历for (size_t i = 0; i < v.size(); ++i)cout << v[i] << " ";cout << endl;// 2. 使用迭代器遍历cout << "swapv data:";auto it = swapv.begin();while (it != swapv.end()){cout << *it << " ";++it;}// 3. 使用范围for遍历for (auto x : v)cout << x << " ";cout << endl;
}

🦊2.6 vector实例化string类的初始化形式

注意:
(1) 有名对象和匿名对象的使用形式的区别。

(2) 此时范围for的使用,最好加上const 和 &
因为范围for的底层其实是迭代器,* it 赋值给e,而这里的*it是string类,每次赋值都是深拷贝,所以加引用可以避免多余的拷贝构造,const是因为不修改。

void TestVector7()
{vector<string> v1;//此时v1指向的就是对象数组//有名对象string s1("张三");v1.push_back(s1);//匿名对象v1.push_back(string("李四"));//直接单参数隐式类型转换v1.push_back("王五");//对名字进行修改v1[1] += "你好";//加const &//范围for的底层其实是*it赋值给e//而这里的*it是string类,每次赋值都是深拷贝for (const auto& e : v1){cout << e << " ";}cout << endl;
}

🌴2.7 sort算法的使用

sort不在vector中,在STL的算法库中。

在这里插入图片描述

(1) sort算法默认排升序,它的参数需要传迭代器。

(2) 那如何控制升降序呢?根据sort的第二个重载,多了一个仿函数的参数。就是下面代码中的greater(降序),less(升序)。其实这两个也是模板,再用这个模板进行实例化对象。并且又重载了operator() 运算符

void TestVector8()
{//sort算法的使用vector<int> v1;v1.push_back(1);v1.push_back(25);v1.push_back(12);v1.push_back(9);v1.push_back(0);v1.push_back(40);//默认排升序greater<int> gt1;//降序 >less<int> gt2;//升序 <//重载了operator()cout << gt1(3, 4) << endl;//0cout << gt1.operator()(3, 4) << endl;//全部排序//有名对象使用//sort(v1.begin(), v1.end(),gt1);//匿名对象使用sort(v1.begin(), v1.end(), greater<int>());//去头去尾排//sort(v1.begin() + 1, v1.end() - 1);//对前一半排序//sort(v1.begin(), v1.begin() + v1.size() / 2);for (auto e : v1){cout << e << " ";}cout << endl;
}

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

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

相关文章

雷军-2022.8小米创业思考-9-爆品模式:产品力超群,具有一流口碑,最终实现海量长销的产品。人人都向往;做减法;重组创新;小白模式

第九章 爆品模式 小米方法论的第三个关键词&#xff0c;就是一切以产品为出发点&#xff0c;打造爆品模式。 大多数人对“爆品”的着眼点仅在于“爆”&#xff0c;也就是产品卖得好。希望产品大卖这没有错&#xff0c;但是“爆”是“品”的结果&#xff0c;爆品是打造出来的&…

【附代码】@hydra.main 没有返回值,如何解决函数返回?

hydra.main 是一个 Python 装饰器&#xff0c;通常与 Hydra 深度学习框架一起使用。它的作用是标识 Hydra 配置文件中的主函数。在 Hydra 中&#xff0c;主函数是一个负责组织整个程序执行流程的函数。这个装饰器告诉 Hydra 这个函数是主函数&#xff0c;但并不要求它有返回值。…

闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?

前言 虽然说&#xff0c;目前 .NET FrameWork 上的大部分类都已经移植到 .NET Core 上&#xff0c;而且 .NET FrameWork 也已经停止了更新&#xff0c;未来必然是 .NET Core 的天下&#xff0c;但要说现在 .NET Core 就能淘汰 .NET FrameWork&#xff0c;我觉得为时尚早&#…

知识付费已达天花板,太多的割韭菜案例了!

一张图片在网上传播&#xff0c;照片有点讽刺&#xff0c;里面两个人&#xff1a;一个人是OpenAI首席执行官萨姆奥特曼&#xff08;Sam Altman&#xff09;&#xff0c;一位是自称清华博士的网络大V李先生&#xff0c;他们被并称为“AI界两大巨头”。 不过贡献不同&#xff0c…

【AD21】钻孔文件的输出

钻孔文件包含了所有需要在PCB上钻孔的位置、孔径和类型&#xff08;如通孔、盲孔、埋孔&#xff09;的详细信息。板厂可以使用这个文件来控制钻孔机进行精确钻孔。 在PCB源文件页面&#xff0c;菜单栏中点击文件->制造输出->NC Drill Files。 在弹出的新界面&#xff0c…

Linux 信号量

Linux 信号量 一、信号量的基本概念1. 计数信号量&#xff08;Counting Semaphore&#xff09;2. 二进制信号量&#xff08;Binary Semaphore&#xff09; 二 、使用场景1. 信号量需要用到的库系统V IPC头文件 2. 代码演示1. 头文件和结构体定义2. 主函数3. 创建/获取共享内存4…

Webpack性能调优:从加载器到插件的全面优化

Webpack 是一个模块打包工具&#xff0c;它将项目中的各种资源&#xff08;JavaScript、CSS、图片等&#xff09;转换成一个或多个浏览器可识别的输出文件。优化 Webpack 的性能主要涉及减少构建时间、减小输出文件大小和提高应用加载速度。 2500G计算机入门到高级架构师开发资…

解析Spring Bean对象的作用域机制

1. 作用域范围 1. singleton单例&#xff1a;在整个SpringBoot应用中&#xff0c;只创建bean的一个实例; 2. propotye多例&#xff1a;每次注入或者通过Spring应用上下文获取的时候&#xff0c;都会创建一个新的bean实例; 3. request请求&#xff1a;一次http请求&#xff0c;…

C++240527

定义自己的命名空间 my_sapce&#xff0c;在 my_sapce 中定义 string 类型的变量 s1&#xff0c;再 定义一个函数 完成 对字符串的逆置 。 #include <iostream>//导入 标准命名空间&#xff0c;cout 和 endl 标识符 存在于标准命名空间中 using namespace std;//定义了自…

springboot+vue+mybatis基于java web的公益网站的设计与实现+jsp+PPT+论文+讲解+售后

现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本公益网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#xff0c;使…

AJ-Report一次排错处理

山重水复疑无路&#xff0c;柳暗花明又一村...... 新项目需要选型开源的AJ-Report&#xff0c;计划再次基础上进行二开。 官网地址&#xff1a; AJ-Report: AJ-Report是一个完全开源&#xff0c;拖拽编辑的可视化设计工具。三步快速完成大屏&#xff1a;配置数据源---->写…

力扣503. 下一个更大元素 II

Problem: 503. 下一个更大元素 II 文章目录 题目描述思路复杂度Code 题目描述 思路 由于此题是环形数组&#xff0c;我们在利用单调栈模板的基础上还需要将给定数组扩大一倍&#xff0c;但实际上我们只需要利用取余的操作模拟扩大数组即可&#xff08;具体操作看代码。在解决有…

Spring Boot集成shiro之使用redis缓存demo

1.背景 上次发了这篇文章《Spring Boot集成Shiro快速入门Demo》后&#xff0c;有网友“just.blue”后台反馈集成redis有点问题&#xff0c;今天特地把集成过程发出来 2.为什么要使用cache 用来减轻数据库的访问压力&#xff0c;从而提升查询效率。 3.Shiro使用Redis做缓存 …

【R语言】获取任意颜色的HTML 颜色代码、十六进制颜色代码、 RGB代码

网站来源&#xff1a; https://htmlcolorcodes.com/ 界面如下所示&#xff1a; 通过鼠标任意选择不同的颜色&#xff0c;就能获取该色的十六进制代码、RGB代码等。 除此之外&#xff0c;还提供了一些常用颜色的便捷选项,如下&#xff1a; 任意选择一种颜色&#xff0c;即可出…

会声会影2024旗舰版神器,让你的视频秒变大片,小白也能轻松上手

在数字时代&#xff0c;视频已经成为了人们表达自我、记录生活的重要方式。无论是旅行中的美景&#xff0c;还是生活中的点滴瞬间&#xff0c;我们都渴望能够用镜头捕捉下来&#xff0c;并通过精心剪辑&#xff0c;将这些美好的画面永远珍藏。然而&#xff0c;对于大多数人来说…

【spring boot+Lazy ORM+mysql】开发一个数据库管理系统实现对应数据库数据查看和修改

【spring bootLazy ORMmysql】开发一个数据库管理系统实现对应数据库数据查看和修改 演示项目地址&#xff1a;http://124.222.48.62:30193/wu-smart-acw-ui/index.html#/login &#xff08;admin/admin&#xff09; 功能 用户登录注册新增、编辑数实例新增、编辑数据库信息…

[论文笔记]SELF-INSTRUCT

引言 今天带来论文SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions的笔记。 大型指令微调的语言模型(被微调以响应指令)展示了在新任务上零样本泛化的显著能力。然而&#xff0c;它们严重依赖于人工编写的指令数据&#xff0c;这种数据在数量、多…

element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入

解决方案&#xff1a; 我是form表单嵌套表格&#xff0c;里面的el-input输入框&#xff0c;输入第一个值的时候会突然失去焦点&#xff0c;需要再次点击输入框才能正常输入&#xff0c;原因是table的key值&#xff0c;需要改成正常的index即可&#xff0c;如果你是循环的&…

服务器重装系统与磁盘操作

诱因&#xff1a;服务器原来装的EXSI&#xff0c;现在要重装一个ubuntu server&#xff0c;出现了下面一些问题&#xff0c;在此记录一下。 目录 1、过程中出现的问题&#xff08;2024.5.26&#xff09;1.1 问题1&#xff1a;如何磨掉原来的ESXI&#xff1f;1.2 问题2&#xf…

赶紧收藏!2024 年最常见 20道 Redis面试题(九)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;八&#xff09;-CSDN博客 十七、如何使用Redis做异步队列&#xff1f; 使用 Redis 作为异步队列主要依赖于 Redis 的列表&#xff08;list&#xff09;数据结构&#xff0c;列表提供了…