C++ 标准模板库(STL):vector
1. vector
- 变长数组,长度根据需要而自动变化的数组。
- 当普通数组会超过内存的情况,这种情况使用vector会让问题的解决便捷许多。
- vector可以用来以邻接表的方式存储图
1.1 vector的定义
- 定义一维变长数组
vector<typename> name;
这个的typename可以是任何基本类型,也可以是STL标准容器模板。
需要注意:如果typename是一个STL容器,定义的时候要在>>符号之加上空格!
vector<int> name;
vector<node> name; //node是结构体
vector<vector<int> > name; // >>之间要加空格,防止被编译器误认为是移位符号!
- 定义二维变长数组
- Arrayname中的每一个元素都是一个vector。
- 可以把二维vector数组当作两个维都可以变长的二维数组理解。
vector<typename> Arrayname [arraySize];
与vector<vector > name不同,vector Arrayname [arraySize];的一维长度已经被固定为arraySize,仅剩另一维是变长的。
1.2 vector容器内元素的访问
通过下标访问
直接通过vi[index]
通过迭代器访问
迭代器可以理解为类似指针的东西
vector<typename>::iterator it;
可以通过it*来访问vector里的元素。
代码实例
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 1; i<= 5; i++){
vi.push_back(i);
}
vector<int>::iterator it = vi.begin();
for(int i = 0; i<5; i++){
printf("%d ",*(it + i));
}
return 0;
}
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 1; i<= 5; i++){
vi.push_back(i);
}
for(vector<int>::iterator it = vi.begin();it != vi.end(); it++){
printf("%d ",*it);
}
return 0;
}
!可以看到vi[i]和*(vi.begin()+i)是等价的。
!begin()是作为取vi的首元素,end()是作为尾元素地址,且end()作为迭代器末尾元素,不储存任何元素。
!vector的迭代器不支持 it < vi.end() 写法,因此循环条件只能用 it != vi.end()。
! 只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法。
1.3 vector 常用函数实例解析
push_back()
在vector后面添加一个元素x,时间复杂度为\(O(1)\)
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 1; i<= 3; i++){
vi.push_back(i);//将1、2、3依次插入vi末尾
}
for(int i=0; i<vi.size(); i++){
printf("%d ", vi[i]);//size给出vi中元素的个数
}
return 0;
}
pop_back()
在vector删除末尾元素x,时间复杂度为\(O(1)\)
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 1; i<= 3; i++){
vi.push_back(i);//将1、2、3依次插入vi末尾
}
vi.pop_back(); //删除vi的末尾元素
for(int i=0; i<vi.size(); i++){
printf("%d ", vi[i]);//size给出vi中元素的个数
}
return 0;
}
size()
所有容器都有的返回元素个数,是unsigned类型,一般就用%d
clear()
用来清空vector中所有元素,时间复杂度为\(O(N)\)
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 1; i<= 3; i++){
vi.push_back(i);//将1、2、3依次插入vi末尾
}
vi.clear();
printf("%d\n",vi.size());
return 0;
}
insert()
insert(it,x)用来向vector的任意迭代器it中插入一个元素x,时间复杂度\(O(N)\)
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 1; i<= 5; i++){
vi.push_back(i);//将1、2、3、4、5依次插入vi末尾
}
vi.insert(vi.begin() + 2,-1);//在vi[2]的为止插入-1
for(int i=0; i<vi.size();i++){
printf("%d ",vi[i]);
}
return 0;
}
erase()
删除单个元素
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 5; i<= 9; i++){
vi.push_back(i);//将5、6、7、8、9依次插入vi末尾
}
vi.erase(vi.begin() + 3); //删除vi[3]位置的元素
for(int i=0; i<vi.size();i++){
printf("%d ",vi[i]);
}
return 0;
}
删除一个区间内的所有元素(左闭右开)
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> vi;
for(int i = 5; i<= 9; i++){
vi.push_back(i);//将5、6、7、8、9依次插入vi末尾
}
vi.erase(vi.begin() + 1,vi.begin() + 4); //删除vi[1]到v[4]位置的元素(左闭右开),即删去vi[1]、vi[2]、vi[3]
for(int i=0; i<vi.size();i++){
printf("%d ",vi[i]);
}
return 0;
}
1.4 vector的常见用途
- 存储数据
- 用邻接表存储图
C++ 标准模板库(STL):vector的更多相关文章
- C++标准模板库(STL)——vector常见用法详解
vector的定义 vector<typename> name; 相当于定义了一个一维数组name[SIZE],只不过其长度可以根据需要进行变化,比较节省空间,通俗来讲,vector就是& ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
随机推荐
- hdfs读写删除过程解析
一.hdfs文件读取过程 hdfs有一个FileSystem实例,客户端通过调用这个实例的open()方法就可以打开系统中希望读取的文件,hdfs通过rpc协议调用Nadmenode获取block的位 ...
- securefx 系统中不到指定文件 (转中文)
如何处理上传工具SecureFX中的中文乱码 工具/原料 SecureFX centos7 方法/步骤 转百度知道 https://jingyan.baidu.com/article/eae07 ...
- MySQL 标识符到底区分大小写么——官方文档告诉你
最近在阿里云服务器上部署一个自己写的小 demo 时遇到一点问题,查看 Tomcat 日志后定位到问题出现在与数据库服务器交互的地方,执行 SQL 语句时会返回 指定列.指定名 不存在的错误.多方查证 ...
- JAVA原生mvc实现用户信息的增删查改
笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...
- Appium 介绍及环境安装
Appium是一个可用于测试iOS. Android操作系统和Windows桌面平台原生应用,移动网页应用和混合应用的自动化测试框架. 原生应用(Native App):用 android.iOS或者 ...
- Linux下MiniGUI库的安装
Linux下MiniGUI库的安装 今天试了下安装MiniGUI的库 先仿照官网的教程安装 传送门:MiniGUI官网 一.配置依赖环境 安装构建工具 apt install binutils aut ...
- 每日CSS_滚动页面动画效果
每日CSS_滚动页面动画效果 2021_1_13 源码链接 1. 代码解析 1.1 html 代码片段 <section> <h2>开 始 滑 动</h2> < ...
- 【C++】《Effective C++》第二章
第二章 构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 默认函数 一般情况下,编译器会为类默认合成以下函数:default构造函数.copy构造函数.non-virtual析构函数. ...
- 【LeetCode】365.水壶问题
题目描述 解题思路 思路一:裴蜀定理-数学法 由题意,每次操作只会让桶里的水总量增加x或y,或者减少x或y,即会给水的总量带来x或y的变化量,转为数字描述即为:找到一对整数a,b使得下式成立: ax+ ...
- 四:WEB源码扩展
前言:WEB源码在安全测试中是非常重要的信息来源,可以用来进行代码审计漏洞也可以用来做信息突破口,其中WEB源码有很多技术需要简明分析,获取某ASP源码后就可以采用默认数据库下载为突破,获取某其他脚本 ...