STL提供了一组表示容器、迭代器、函数对象和算法的模板。

  • 容器是一个与数组类似的单元,可以存储若干个值。STL容器是同质的,即存储的值的类型相同;
  • 算法是完成特定任务(如对数组进行排序或在链表中查找特定值)的处方;
  • 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;
  • 函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。

STL使得能够构造各种容器(包括数组、队列和链表)和执行各种操作(包括搜索、排序和随机排列)

接下来介绍几种ACMer必须掌握的几个成员

vector容器

1)什么是vector

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。

2)如何定义

//头文件必须包含:
#include<vector>
//定义一个vector,int为数组元素的数据类型,test1为动态数组名
vector<int>test1;
//定义一个元素为结构体型的vector
vector<information>test2
//定义一个迭代器
vector<int>::iterator it;

vector的初始化可以有很多种方式:

//定义10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
① vector<int> a(10);
//定义了10个整型元素的向量,且给出每个元素的初值为1
② vector<int> a(10,1);
//用b向量来创建a向量,整体复制性赋值
③ vector<int> a(b);
//定义了a值为b中第0个到第2个(共3个)元素
④ vector<int> a(b.begin(),b.begin+3);
//从数组中获得初值
⑤ int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+7);

3)常用的Vector函数

1、容量函数

  • 容器大小:a.size();//返回a中元素个数

  • 容器容量:a.capacity();//预分配的内存空间与size不同,返回a在内存中总共可以容纳的元素个数

  • 容器判空:a.empty();//空则返回true,否则返回false

  • 更改容器大小:a.resize(num);a.resize(num,value);

a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,其值为2

2、增加函数

  • 将区间[first,end)中的数据赋值给a (注意区间的开闭):a.assign(first,end)

  • a只含n个元素,且每个元素为elem:a.assign(n,elem)

a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
a.assign(4,2);//a只含4个元素,且每个元素为2
  • 末尾添加元素:a.push_back(value) //在a的最后一个向量后插入一个元素,其值为value
  • 任意位置插入一个元素:a.insert(location,value)//在a的第location的位置插入value
  • 任意位置插入num个相同的元素:a.insert(location,num,value)//在a的第location的位置插入num个值为value的数
  • 插入另一个向量的[first,end)间的数据:a.insert(location,first,end)
//假设 a:5 7 3 1 4;b: 2 3 4 5 6 7 8
a.push_back(2);//a:5 7 3 1 4 2
a.insert(a.begin()+1,2);//a:5 2 7 3 1 4
a.insert(a.begin()+1,2,3);//a:5 3 3 7 3 1 4
a.insert(a.begin()+1,b.begin()+2,b.begin()+5);//a:5 4 5 6 7 3 1 4

3、删除函数

  • 头部删除元素:a.pop_front();
  • 末尾删除元素: a.pop_back();
  • 删除[first,end)之间的元素: a.erase(first, end);
  • 清空所有元素: a.clear();
a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)

4、迭代器

  • 开始指针:a.begin();
  • 末尾指针:a.end();//指向最后一个元素的下一个位置

5、访问函数

  • 返回a的第一个元素:a.front();
  • 返回a的最后一个元素:a.back();
  • 下标访问:a[1];//并不会检查是否越界
  • at方法访问:a.at(1);//会检查越界,若越界则抛出out of range异常

6、其他函数及操作

  • 交换函数:a.swap(b);//b也为向量,将a中的元素和b中的元素进行整体交换
  • 比较操作:a==b;//b也为向量,向量的比较还有!=,>=,<=,>,<

7、算法

需要包含头文件:

#include<algorithm>
(1)sort(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

STL标准模板库之vector的更多相关文章

  1. C++ STL标准模板库(vector)

    //vector的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> using na ...

  2. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  3. STL标准模板库介绍

    1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...

  4. STL学习系列一:STL(标准模板库)理论基础

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...

  5. STL(标准模板库)理论基础,容器,迭代器,算法

    基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间.   ...

  6. STL(标准模板库)基本概念

    一.什么是STL STL(Standard Template Library,标准模板库)的从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),容器 ...

  7. C++ Templates STL标准模板库的基本概念

    STL标准库包括几个重要的组件:容器.迭代器和算法.迭代器iterator,用来在一个对象群集的元素上进行遍历操作.这个对象群集或许是一个容器,或许是容器的一部分.迭代器的主要好处是,为所有的容器提供 ...

  8. C++之路起航——标准模板库(vector)

    vector(动态数组或向量):动态分配内存空间的线性储存结构. 需要包括头文件<vector> 定义: vector<数据类型> 变量名: Eg: vector<int ...

  9. STL标准模板库 向量容器(vector)

    向量容器使用动态数组存储.管理对象.因为数组是一个随机访问数据结构,所以可以随机访问向量中的元素.在数组中间或是开始处插入一个元素是费时的,特别是在数组非常大的时候更是如此.然而在数组末端插入元素却很 ...

随机推荐

  1. Shiro + Redis集成思路

    首先,确保Spring配置完毕了. 集成Shiro 1.在pom.xml中追加依赖 <dependency> <groupId>org.apache.shiro</gro ...

  2. 一些scala的操作

    Scala获取当前目录下所有文件 import java.io.File //获取目录下的所有文件,当前项目目录输入new File(".") def getFiles1(dir: ...

  3. LG5492 [PKUWC2018]随机算法

    题意 有一种贪心求最大独立集的算法: 随机一个排列 按顺序加入独立集,如果一个点能加入,就加入\({S}\) 给出一张图,问得出正确答案的概率. \(n \leq 20\) 传送门 思路 用 \(dp ...

  4. 重启hdfs集群的时候,报大量的gc问题。

    问题现象: 2019-03-11 12:30:52,174 INFO org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or ...

  5. 配置了ssh免密登录还是提示权限不足怎么解决

    通过 管理终端 进入系统.通过 cat 等指令查看 /etc/ssh/sshd_config 中是否包含类似如下配置: AllowUsers root test DenyUsers test Deny ...

  6. 会话技术cookie与session

    目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...

  7. TynSerial序列(还原)TClientDataSet

    TynSerial序列(还原)TClientDataSet 可以一次性序列(还原)多个TClientDataSet. 1)TClientDataSet查询数据 procedure TForm1.Qry ...

  8. ASP.NET MVC传递Model到视图的多种方式之通用方式的使用

    ASP.NET MVC传递Model到视图的多种方式总结——通用方式的使用 有多种方式可以将数据传递到视图,如下所示: ViewData ViewBag PartialView TempData Vi ...

  9. shell 脚本 - 关于循环的应用

    array=('Brand' 'BrandInfo' 'BrandBaojia' 'VehicleType' 'BrandBaoyang' 'Youhui' 'Config' \ 'Comment' ...

  10. Ionic4.x 创建页面以及页面跳转

    创建页面: 1.cd 到项目目录 2.通过ionic g page 页面名称 3.创建完成组件以后会在 src 目录下面多一个 button 的目录,它既是一个页面也是一个 模块. 4.如果我们想在 ...