C++标准模板库(STL)之Vector
在C中,有很多东西需要自己实现。C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能。
具体容器链接:set,string,map,queue,priority_queue,stack,pair
1、vector的用法
vector:向量,这里叫“变长数组”,长度根据需要而自动改变的数组。有时会碰到普通数组会超过内存的情况,可以使用vector解决。而且,vector可以用来以邻接表的方式存储图,可以解决当节点数太多,无法使用邻接矩阵,又害怕使用指针实现邻接表的时候,使用很简单。
使用vector,需要添加头文件,#include<vector>,还要头文件下加入using namespace std;
1.1、vector的定义
vector<typename> name;
相当于定义了一个一维数组name[SIZE],只不过size可以根据需要进行变化,比较节省空间,也就是变长数组
typename:任何基本类型,int,char,double,结构体,STL容器vector,set,queue等。
如果typename是STL容器,定义的时候要在>>之后加上空格,如果不加空格,编译器就把它认为是位操作。
vector<int> stu;
vector<double> stu;
vector<char> stu;
vector<Node> stu;//Node是结构体类型
vector<vector<int>> name;
二维数组的定义:一维是一个数组的数组
vector<typename> Arrayname[arraySize]
/*Arrayname[]的每一个元素都是一个vector,可以理解为两个维都是可变长的二维数组*/
写法一:vector<int> vi[100];//一维长度已经固定为arraySize
vi[0]~vi[99]中每一个都是一个vector容器。
写法二:vector<vector<int>> vi//区别:这个两个维度是变长的
1.2、vector容器内元素的访问
vector访问方式:下标访问、迭代器访问。
1.2.1、下标访问
和访问普通数组一样,下标从0~size()-1。
比如定义的:vector<typename> vi,使用vi[index](vi[0],vi[1])。
1.2.2、通过迭代器访问
迭代器(iterator)理解为类似指针的东西。
定义:vector<typename>::iterator it;//it是一个迭代器变量。
#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vi;
for(int i=;i<;i++)
{
vi.push_back(i);
}
vector<int>::iterator it=vi.begin();//vi.begin()是vi的首元素地址,用迭代器变量it指向这个地址
for(int i=;i<;i++)
{
printf("%d\n",*(it+i));//输出vi[i];
}
return ;
}
注:vi[i]与*(vi.begin()+i)等价
end()函数:并不是取vi的尾元素地址,而是取尾元素的下一个地址。就相当于左闭右开区间。
#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vi;
for(int i=;i<;i++)
{
vi.push_back(i);
}
vector<int>::iterator it=vi.begin();//vi.begin()是vi的首元素地址,用迭代器变量it指向这个地址
for(int i=;i<;i++)
{
printf("%d\n",*(it+i));//输出vi[i];
}
//使用begin(),end()函数,访问
for(vector<int>::iterator it=vi.begin();it!=vi.end();it++)
{
printf("%d\n",*it);
}
return ;
}
注:在常用STL容器中,只有vector和string才可以使用vi.begin()+i这种迭代器加整数的写法,因为他们两个看做数组的下标的访问方式。
1.3、vector常用函数
1.3.1、push_back()函数
push_back(x)就是在vector后面添加一个元素x,时间复杂度为O(1)。
1.3.2、pop_back()函数
pop_back(x)就是删除vector的尾元素x,时间复杂度为O(1)。
1.3.3、size()函数
用来获得vector中元素的个数,时间复杂度为O(1)。
1.3.4、clear()函数
用来清空vector所有的元素,时间复杂度为O(N),N为元素总个数。
1.3.5、insert()函数
用insert(it,x)往vector的任意迭代器it初传入一个元素x。时间复杂度为O(N)。
1.3.6、erase()函数
用erase()函数删除单个元素,或者一个区间的元素
#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
vector<int> vi;
for(int i=;i<;i++)
{
vi.push_back(i);//jpush_back()函数应用
}
vi.pop_back(i);//删除vi的尾部元素4
int i=vi.size();//size()返回的unsingned类型
vi.clear();//清空vector所有元素
vi.insert(vi.begin()+,);//将23插入vi[2]的位置
vi.erase(vi.begin()+);//删除单个元素vi[1];
vi.erase(vi.begin()+,vi.begin()+);//删除vi[1],vi[2],左闭右开区间
return ;
}
1.4、vector常见用途
1.4.1、存储数据
vector本身可以作为数组使用,当元素个数不确定的时候,可以很好地节省空间。
有些时候需要把部分数据输出在同一行,用空格隔开数据。由于数据的个数不知道,
可以使用vector记录所有的需要输出的数据,然后一次性输出。
1.4.2、用邻接表存储图
可以使用vector实现邻接表,避免使用指针的邻接链表。
2018-09-25 14:24:20 @author:Foreordination
C++标准模板库(STL)之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模板类也需要两个模板参数, ...
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
随机推荐
- 服务器被疑似挖矿程序植入,发现以及解决过程(建议所有使用sonatype/nexus3的用户清查一下)
此次服务器被植入挖矿程序发现起来较为巧合,首先是上周三开始,我通过sonatype/nexus3搭建的仓库间歇性崩溃,但是每次重新start一下也能直接使用所以没有彻底清查,去docker logs里 ...
- APP压力测试 monkey(新猿旺学习总结)
安卓APP做压力测试 需要配置JDK(Java)和 配置SDK 遮掩才能使用adb命令连接手机进行模拟动作事件进行压力测试 配置 K JDK 与 K SDK 环境 a java 与 与 sdk 用于 ...
- 【js】js声明与数据类型
之前整理知识点感觉有点没有针对性,每期知识点之间都没有关联,不成体系,其实对学习与运用知识并无益,随着知识的积累,不使用就会忘记.所以从本次开始,将对知识点进行体系化.先列出本期知识体系图,再进行逐步 ...
- Haproxy官方文档翻译(第三章)全局参数(1) 附英文原文
3.全局参数 在global这个节点里的参数是“进程范围的”并且经常是“操作系统指定”的.它们通常是一次性设置而且一旦正确设置不需要动来动去的.它们中的一些和命令行对应. global节点支持以下关键 ...
- cf C题
题意:矩阵只包含0,1两种数字,给你一个矩阵A,另一个矩阵B,每一次可以从A中选出一个子矩阵,点击一次使得这个子矩阵的四个角的数字变成与原来相反的数,0变1,1变0.问你可不可以经过有限次的变换把矩阵 ...
- top命令详解不完整的地方欢迎评论
第一行: top - 20:42:47 up 57 days, 1:25, 4 users, load average: 0.00, 0.00, 0.00 现在时间20:42:47,启动了57 ...
- centos卸载mysql
1.查看系统安装mysql rpm -qa|grep -i mysql 2.卸载 rpm -ev --nodeps mysql-community-release-el7-5.noarch 3.查询剩 ...
- android TextView描边
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要重写了onDraw方法. 这一边讲一个进阶功能,实现textView的描边效果. 上效果图. 上代码: public class St ...
- tree与GridView交互
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="OgGridView.asp ...
- 论文笔记:Prediction-Tracking-Segmentation
Prediction-Tracking-Segmentation 2019-04-09 18:47:30 Paper:https://arxiv.org/pdf/1904.03280.pdf 之所以要 ...