C++STL详解+代码分析+典例讲解

vector 的介绍:

1、vector是表示可变大小数组的序列容器。
2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元素进行访问。
3、vector与普通数组不同的是,vector的大小是可以动态改变的。
4、当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。
5、vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。不同的库采用不同的策略权衡空间的使用和重新分配,以至于在末尾插入一个元素的时候是在常数的时间复杂度完成的。
6、由于vector采用连续的空间来存储元素,与其他动态序列容器相比,vector在访问元素的时候更加高效,在其末尾添加和删除元素相对高效,而对于不在其末尾进行的删除和插入操作效率则相对较低。
 

 

vector 的使用

1.定义方式

法一:构造一个某类型的空容器。

vector<int> v1; //构造int类型的空容器

法二:构造一个含有n个val的某类型容器。

vector<int> v2(10, 2); //构造含有10个2的int类型容器

法三:拷贝构造某类型容器的复制品

vector<int> v3(v2); //拷贝构造int类型的v2容器的复制品

法四:使用迭代器拷贝构造某一段内容。

vector<int> v4(v2.begin(), v2.end()); //使用迭代器拷贝构造v2容器的某一段内容

注意:该方式也可用于拷贝其他容器的某一段内容。

string s("hello world");
vector<char> v5(s.begin(), s.end()); //拷贝构造string对象的某一段内容

vector的空间增长问题

size和capacity

通过size函数获取当前容器中的有效元素个数,通过capacity函数获取当前容器的最大容量。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.size() << endl; //获取当前容器中的有效元素个数cout << v.capacity() << endl; //获取当前容器的最大容量return 0;
}

reserve和resize

通过reserse函数改变容器的最大容量,resize函数改变容器中的有效元素个数。

reserve规则:
 1、当所给值大于容器当前的capacity时,将capacity扩大到该值。
 2、当所给值小于容器当前的capacity时,什么也不做。

resize规则:
 1、当所给值大于容器当前的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则默认为0。
 2、当所给值小于容器当前的size时,将size缩小到该值。

 

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.size() << endl; //10cout << v.capacity() << endl; //10v.reserve(20); //改变容器的capacity为20,size不变cout << v.size() << endl; //10cout << v.capacity() << endl; //20v.resize(15); //改变容器的size为15cout << v.size() << endl; //15cout << v.capacity() << endl; //20return 0;
}

empty

通过empty函数判断当前容器是否为空。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);cout << v.empty() << endl;return 0;
}

vector的迭代器使用

 

7a77ac3e3e1f47998aa42b93947c2af5.png

 

begin和end

通过begin函数可以得到容器中第一个元素的正向迭代器,通过end函数可以得到容器中最后一个元素的后一个位置的正向迭代器。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);//正向迭代器遍历容器vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";it++;}cout << endl;return 0;
}

比方说这道题中,在一行中需要,排序,我们这里使用了迭代器

df7e3d7c4879424ca3b8a7dc5569d9f4.png

6cd7bb8c3dbe40dd821e0de1a7093768.png

rbegin和rend

通过rbegin函数可以得到容器中最后一个元素的反向迭代器,通过rend函数可以得到容器中第一个元素的前一个位置的反向迭代器。
反向迭代器遍历容器:

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 2);//反向迭代器遍历容器vector<int>::reverse_iterator rit = v.rbegin();while (rit != v.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}

vector的增删查改

 

push_back和pop_back

通过push_back函数对容器进行尾插,pop_back函数对容器进行尾删。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1); //尾插元素1v.push_back(2); //尾插元素2v.push_back(3); //尾插元素3v.push_back(4); //尾插元素4v.pop_back(); //尾删元素v.pop_back(); //尾删元素v.pop_back(); //尾删元素v.pop_back(); //尾删元素return 0;
}

这里的应用非常广,尤其在字符串那一块,这里给大家整一道相关的编程题

704f114e59a4428e8ebcda0016b5df02.png

 

如果用上述我说的来解决的话

#include<bits/stdc++.h>
using namespace std;
int main()
{string s, t;cin >> s >> t;int q;cin >> q;while (q--){string s1, t1;int l1, r1, l2, r2;cin >> l1 >> r1 >> l2 >> r2;for (int i = l1-1; i <= r1-1; i++){s1.push_back(s[i]);}for (int i = l2 - 1; i <= r2-1; i++){t1.push_back(t[i]);}if (s1 > t1)cout << "erfusuer"<<endl;else if (s1 < t1){cout << "yifusuyi" << endl;}elsecout << "ove"<<endl;s1 = "";t1 = "";}return 0;
}

即可依葫芦画瓢解决,详解在我之前发的字符串的编程题有解释,若代码看不懂可以往前看。

insert和erase

通过insert函数可以在所给迭代器位置插入一个或多个元素,通过erase函数可以删除所给迭代器位置的元素,或删除所给迭代器区间内的所有元素(左闭右开)。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.insert(v.begin(), 0); //在容器开头插入0v.insert(v.begin(), 5, -1); //在容器开头插入5个-1v.erase(v.begin()); //删除容器中的第一个元素v.erase(v.begin(), v.begin() + 5); //删除在该迭代器区间内的元素(左闭右开)return 0;
}

find函数:
find函数共三个参数,前两个参数确定一个迭代器区间(左闭右开),第三个参数确定所要寻找的值。
find函数在所给迭代器区间寻找第一个匹配的元素,并返回它的迭代器,若未找到,则返回所给的第二个参数。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator pos = find(v.begin(), v.end(), 2); //获取值为2的元素的迭代器v.insert(pos, 10); //在2的位置插入10pos = find(v.begin(), v.end(), 3); //获取值为3的元素的迭代器v.erase(pos); //删除3return 0;
}

注意: find函数是在算法模块(algorithm)当中实现的,不是vector的成员函数。

在这里再给大家介绍一个典型题

5e9f001e821442bca7c5758431652da1.png

代码:

#include<iostream>
#include<string.h>
using namespace std;
int main()
{string s1, s2;cin >> s1 >> s2;if (s2.find(s1) != -1)//如果找到返回首位置,未找到返回-1{cout << s1 << " is substring of " << s2 << endl;}else if (s1.find(s2) != -1){cout << s2 << " is substring of " << s1 << endl;}elsecout << "No substring" << endl;return 0;
}

swap

通过swap函数可以交换两个容器的数据空间,实现两个容器的交换。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v1(10, 1);vector<int> v2(10, 2);v1.swap(v2); //交换v1,v2的数据空间return 0;
}

在c语言中交换两个数我们需要设立中间变量,而在c++中可以直接通过swap函数来解决

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v1(10, 1);vector<int> v2(10, 2);v1.swap(v2); //交换v1,v2的数据空间return 0;
}

clear

清除字符串内容

#include"vector.h"
#include<iostream>
#include<vector>
using namespace std;int main()
{//dabai::test1();vector<int> arr;vector<int> s;arr.push_back(11);arr.push_back(11);arr.push_back(11);arr.push_back(11);arr.pop_back();arr.insert(arr.begin()+2, 30);arr.erase(arr.begin() + 2);//arr.resize(2);//arr.reserve(100);s.swap(arr);cout << arr.size()<< endl;cout << s.size() << endl;s.clear();cout << s.size() << endl;return 0;
}

其实也相当于 s="";

元素访问

vector当中实现了 [ ] 操作符的重载,因此我们也可以通过“下标+[ ]”的方式对容器当中的元素进行访问。

即你可以把他当作数组一样使用

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 1);//使用“下标+[]”的方式遍历容器for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;return 0;
}

我们上面说到vector是支持迭代器的,所以我们还可以用范围for对vector容器进行遍历。(支持迭代器就支持范围for,因为在编译时编译器会自动将范围for替换为迭代器的形式)

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 1);//范围forfor (auto e : v){cout << e << " ";}cout << endl;return 0;
}

 

 

 

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

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

相关文章

基于物联网的智能仓管理系统方案

基于物联网的智能仓管理系统方案 一、项目背景 随着企业业务的快速发展&#xff0c;传统的人工仓库管理方式已经无法满足现代企业的需求。仓库运营效率低下、货物出入库错误、库存不准确等问题不断涌现。因此&#xff0c;我们提出一个基于物联网技术的智能仓管理系统方案&…

Redis 五大经典业务问题

一 缓存穿透 缓存穿透是指当请求的数据既不在缓存中也不存在于数据库中时&#xff0c;请求会直接穿透缓存层&#xff0c;到达数据库层。这通常是由于恶意攻击或者程序错误造成的&#xff0c;比如攻击者故意请求不存在的大量数据&#xff0c;导致缓存不命中&#xff0c;所有的请…

智能优化算法应用:基于被囊群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于被囊群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于被囊群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.被囊群算法4.实验参数设定5.算法结果6.参考文…

Moco框架的搭建使用

一、前言   之前一直听mock&#xff0c;也大致了解mock的作用&#xff0c;但没有具体去了解过如何用工具或框架实现mock&#xff0c;以及也没有考虑过落实mock&#xff0c;因为在实际的工作中&#xff0c;很少会考虑用mock。最近在学java&#xff0c;刚好了解到moco框架是用于…

城市基础设施智慧路灯改造的特点

智慧城市建设稳步有序推进。作为智慧城市的基础设施&#xff0c;智能照明是智慧城市的重要组成部分&#xff0c;而叁仟智慧路灯是智慧城市理念下的新产品。随着物联网和智能控制技术的飞速发展&#xff0c;路灯被赋予了新的任务和角色。除了使道路照明智能化和节能化外&#xf…

安全扫描五项简介

目录 安扫五项 1.代码检测 2.主机基线 nginx合规检查 麒麟基线 3.WEB扫描 4.渗透测试 用户枚举漏洞 漏洞描述 修复建议 点击劫持漏洞 漏洞描述 修复建议 XSS漏洞 漏洞描述 修复建议 3.主机漏洞 超高危漏洞 高危漏洞 中危漏洞 低危漏洞 信息漏洞 参考信息…

用电商API接口获取拼多多的商品详情数据

pinduoduo.item_get_app_pro-根据ID取商品详情原数据 公共参数 API请求地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_searc…

一步一步写线程之一简单的开始

一、多线程 多线程不管是在前面的文章分析中还是在网上还是大书籍上&#xff0c;学习C/C多线程编程是无法绕过的&#xff0c;即使使用别人封装好的框架&#xff0c;包括使用STL的一些库&#xff0c;如果仅仅是简单的应用&#xff0c;可能也就过去了。不过&#xff0c;稍微复杂…

VBA_MF系列技术资料1-237

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

[Linux] 用LNMP网站框架搭建论坛

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守护进程 它是php.ini是一个php解析器 工作过程&#xff1a; 1.当客户端通过域名请求访问时&#xff0c;Nginx会找到对应的虚拟主机 2. Nginx将确定请求。 对于静态请求&#xff0c;Nginx会自行处理…

结构体和位段

结构体&#xff1a; C语言中&#xff0c;我们之前使用的都是C语言中内置的类型&#xff0c;比如整形&#xff08;int&#xff09;、字符型&#xff08;char&#xff09;、单精度浮点型&#xff08;float&#xff09;等。但是我们知道&#xff0c;我们现实世界中&#xff0c;还…

聊聊spring.mvc.servlet.load-on-startup

序 本文主要研究一下spring.mvc.servlet.load-on-startup spring.mvc.servlet.load-on-startup org/springframework/boot/autoconfigure/web/servlet/WebMvcProperties.java ConfigurationProperties(prefix "spring.mvc") public class WebMvcProperties {//.…

json精讲

本文介绍json的规范及javascript和java对数据的交换读取 1. json介绍1.1 json简介1.2为什么使用 JSON&#xff1f; 2. json规范2.1基础规范2.2 key值为-字符串、数字、布尔值2.3 key值为对象Object2.4 key值为数组2.5 json本身就是一个数组 3.javascript操作json3.1 javascript…

WPF(Windows Presentation Foundation) 的 Menu控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 Menu 是一种用于创建菜单的控件。菜单通常位于应用程序窗口的顶部&#xff0c;并提供了一组命令或选项&#xff0c;用于导航到不同的功能区域、执行特定的操作或访问特定的功能。 Menu 控件是 WPF 中的一个容器…

2、关于使用ajax验证绕过(实例2)

ajax原理我上一篇有写过&#xff0c;参考&#xff1a;1、关于前端js-ajax绕过-CSDN博客 一、实例环境&#xff1a; 为手机上的某一割韭菜app 二、目的&#xff1a; 实现绕过手机验证码&#xff0c;找回密码 三、工具&#xff1a; bp代理 四、验证步骤如下&#xff1a; …

ECU安全学习网站和书籍介绍

ECU安全是指关注和保护汽车电子控制单元&#xff08;ECU&#xff09;的安全性和防护措施。ECU是现代汽车中的关键组件&#xff0c;它负责监控和控制车辆各种系统的运行&#xff0c;如发动机、制动、转向等。ECU安全的重要性在于防止恶意攻击者操控或干扰车辆的操作。 ECU安全涉…

hive自定义函数及案例

一.自定义函数 1.Hive自带了一些函数&#xff0c;比如&#xff1a;max/min等&#xff0c;但是数量有限&#xff0c;自己可以通过自定义UDF来方便的扩展。 2.当Hive提供的内置函数无法满足你的业务处理需要时&#xff0c;此时就可以考虑使用用户自定义函数。 3.根据用户自定义…

GitHub为Rust语言添加了供应链安全工具

GitHub的供应链安全特性包括咨询数据库、Dependabot警报和依赖关系图现在可以用于Rust Cargo文件。 为了帮助Rust开发人员发现和防止安全漏洞&#xff0c;GitHub已经为快速增长的Rust语言提供了供应链安全特性套件。 这些特性包括GitHub Advisory Database&#xff0c;它已经有…

构建外卖系统:使用Django框架

在当今数字化的时代&#xff0c;外卖系统的搭建不再是什么复杂的任务。通过使用Django框架&#xff0c;我们可以迅速建立一个强大、灵活且易于扩展的外卖系统。本文将演示如何使用Django构建一个简单的外卖系统&#xff0c;并包含一些基本的技术代码。 步骤一&#xff1a;安装…

shell的条件测试

shell 的条件测试 概述 条件测试是 shell 编程中非常重要的一个概念&#xff0c;它允许我们根据某个条件是否满足&#xff0c;来选择执行相应的任务。 条件测试的语法 shell 中的条件测试语法如下&#xff1a; [ 条件表达式 ]如果条件表达式为真&#xff0c;则返回 0&…