vector的学习(系统的学习)
首先讲一下vector,vector被称作向量容器,头文件要包括#include<vector>
可以考虑下面定义:
vector<int> x;
vector<char> y;
x和y分别是整形向量,字符型向量,他们都是空向量
下面介绍如何使用vector:
1、vector的初始化:
int n;
cin>>n;
vector<double>d(n),e(n,1.5);
d和e是两个double型向量,长度和容量都为n,但是d的n个元素被默认置为0,而e的n个元素被置为1.5,可以有下列代码验证
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int main()
{
int n;
cin>>n;
vector<double>d(n),e(n,1.5);
for(int i=;i<n;i++) cout<<d[i]<<" ";
cout<<endl;
for(int i=;i<n;i++) cout<<e[i]<<" ";
cout<<endl;
return ;
}
2、下面介绍size和push_back,front,capacity,pop_back,back等用法
v.size:返回向量当前长度,也就是元素的个数。
v.push_back:在向量的尾部添加一个元素,当前长度加一,如果空间不够,则将容量扩大为原先容量的2倍
v.front:返回向量第一个元素
v.back:返回向量最后一个元素
v.capacity:返回向量中最多可容纳的元素数目
v.pop_back:删除向量的最后一个元素,并且长度减1
可以由下面代码验证:
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int main()
{
vector<char>v;
int c=;
for(int i=;i<;i++) v.push_back(c+i);
for(int i=;i<v.size();i++) cout<<v[i]<<" ";//v.size=5,结果是a b c d e
cout<<endl;
cout<<v.size()<<" "<<v.capacity()<<endl;//结果是5 8,当前长度是5 可容纳8个元素
v.pop_back();
for(int i=;i<v.size();i++) cout<<v[i]<<" ";//输出结果为a b c d ,因为已经删除最后一个元素了
cout<<endl;
cout<<v.front()<<" "<<v.back()<<endl;//结果是a d,第一个元素和最后一个元素
cout<<v.size()<<" "<<v.capacity()<<endl;//结果是4 8,长度减1,但是容量不变
return ;
}
3、下面讲一下向量迭代器:iterator
STL提供成为迭代器的对象,他能够指向一个元素,存取那个元素的值,并能按一种与任何特定容器无关的方法(即一种通用机制)从容器中的一个元素移动到
另一个元素
向量的迭代器可以是指向元素的指针p,通过p引用vector中的元,也可以被实现指向向量起点的指针p加上一个位置值index
为了初始化一个向量迭代器,每个STL容器至少提供两个成员函数:begin(),end()。
begin():返回迭代器的值,该值是容器第一个元素的位置
end:返回迭代器的值,该值是容器最后一个元素的下一个的位置
迭代器的基本操作符:
++:将迭代器从当前位置移动到下一个元素的位置,可用前缀操作符,也可做后缀操作符
--:将迭代器从当前位置移动到前一个元素的位置,可用前缀操作符,也可做后缀操作符
*:存取迭代器所指的元素
=:两个相同类型的迭代器it1,it2,执行it1=it2,使得it1也指向it2的位置
==:两个类型相同的迭代器it1,it2,若他们指向同一个元素,则it1==it2返回true
!=:两个类型相同的迭代器it1,it2,若他们指向不同元素,则it1!=it2返回true
+,-,+=,-=:
[]:对迭代器it及整数n,it[n]返回从it的当前位置向前或向后n个元素的引用
下面的代码可以验证:
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int main()
{
vector<char>v;
int c=;
for(int i=;i<;i++) v.push_back(c+i);
vector<char>::iterator it1=v.begin(),it2=v.end();//申请两个迭代器,并初始化它们
for(it1;it1!=it2;it1++) cout<<*it1<<" ";//结果是a b c d e
cout<<endl;
it1=v.begin();
it1+=;
it2-=;
cout<<*it1<<" "<<*it2<<endl;//结果是e b
it1++;
it2--;
cout<<*it1<<" "<<*it2<<endl;//结果是 a
cout<<it2[]<<" "<<it2[-]<<endl;//结果是 b 输出后面的一个元素,前面的一个元素
return ;
}
4、下面是向量的插入和删除操作:
成员函数 push_back、pop_back、back都是在向量尾部进行操作的函数,一般情况下是在向量任何位置进行插入和删除操作,vector完成这些操作的函数有:
v.insert(it,a):在it指定元素前插入a
v.insert(it,n,a):在it指定位置前插入n个a
v.erase(it):删除it指定的位置,返回指定元素的下一个元素的迭代器
v.erase(it1,it2):删除it1~it2-1之间的所有元素,返回最后一个被删除元素的下一个元素的迭代器
v.clear():删除所i有元素
v.reserve(n):向量的容量为n,可以防止在插入和删除的时候向量容量经常发生改变
v.reverse(it,it+n) :反转it~it+n-1的所有元素
下面代码可以验证:
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=5e3+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int main()
{
vector<int>v;
for(int i=;i<;i++) v.push_back(i);
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果是0 1 2 3 4
cout<<endl;
it=v.begin();
v.insert(it+,);//输出结果是0 1 5 2 3 4,因为it指向第一个元素,it+2则指向第三个元素,在第三个元素之前插入5
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
cout<<endl;
it=v.begin();
v.insert(it,,);//书上说插入元素之后要重新给it赋值,因为向量空间改变了,,具体按着书上来,每次插入之后都给it重新赋值
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果为6 6 6 0 1 5 2 3 4,在it指定元素之前插入3个6
cout<<endl;
it=v.begin();
v.erase(it);
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果为6 6 0 1 5 2 3 4,删除了第一个元素
cout<<endl;
//vector<int>::it1;
it=v.begin();
v.erase(it,it+);
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果为1 5 2 3 4 删除了前三个元素
cout<<endl;
v.clear();
it=v.begin();
for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//没有输出结果,因为已经清空了
return ;
}
5、二维向量
如果一个向量的每一个元素是一个向量,则称为二维向量:例如
vector<vector<int> >vv(3,vector<int>(4)); 将构造一个二维向量vv,它含有3个元素,每个元素又是含有4个int型元素的向量,编译器两次调用构造函数构造对象vv,第一次调用构造函数构造一个无名的含四个0的vector<int>对象,第二次调用构造函数,以这个无名向量为初值初始化它的三个元素。 一般的vv[r][c]访问第r行第c列的值,表达式vv,size()的值是3,vv[1].size()的值是4,也可以产生长度不一样的向量,具体看代码
#include<iostream>
#include<string.h>
#include<map>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<cmath>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e5+;
const int maxk=3e5+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
#define Lson l,mid,rt<<1
#define Rson mid+1,r,rt<<1|1
int main()
{
vector<vector<int> >vv;
for(int i=;i<=;i++)
vv.push_back(vector<int>(i,));//每一行长度为i,初值为0
for(int i=;i<;i++)
{
for(int j=;j<vv[i].size();j++)
{
cout<<vv[i][j]<<" ";
}
cout<<endl;
}
return ;
}
下面是vector的sort函数的用法
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=+;
int main()
{
vector<int>a;
a.push_back();
a.push_back();
a.push_back();
sort(a.begin(),a.end());
for(int i=;i<;i++) cout<<a[i]<<endl;
return ;
}
vector的学习(系统的学习)的更多相关文章
- 4 WPF学习---系统的学习XAML语法
转载:http://blog.csdn.net/fwj380891124/article/details/8093001 1,XAML文档的树形结构: UI在用户眼里面是个平面结构.如下图所示,在用户 ...
- set学习(系统的学习)
set是STL中一种标准关联容器.它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高.set,顾名思义是“集合”的意思,在set中 ...
- NNVM打造模块化深度学习系统(转)
[摘录理由]: 之所以摘录本文,主要原因是:该文配有开源代码(https://github.com/dmlc/nnvm):读者能够直接体会文中所述的意义,便于立刻展开研究. MXNet专栏 :NNVM ...
- SpeeDO —— 并行深度学习系统
SpeeDO —— 并行深度学习系统 摘要: 最近,AlphaGo又带起了一波深度学习的热潮.深度学习在很多领域都大幅提高了模型的精度,使得很多以前在实验室中的技术得以运用到日常的生活之中.然而, ...
- node+vue进阶【课程学习系统项目实战详细讲解】打通前后端全栈开发(1):创建项目,完成登录功能
第一章 建议学习时间8小时·分两次学习 总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章]) 视频教程地 ...
- Google会思考的深度学习系统
上周五在旧金山举行的机器学习会议上,Google软件工程师Quoc V. Le讲解了Google的"深度学习"系统是如何运作的. "深度学习"需要用到大型计算机 ...
- 如何系统的学习Java
初学者记住一点,学习Java一定是连续性的且循序渐进的“系统化”学习,首先我给你提供一个优秀Java工程师的学习路线. web前端方面:html.css,Java.jQuery.xml解析.Boots ...
- 一点点linux系统的学习心得
我相信你正在阅读本文的时候,可能是因为你渴望学习Linux技术.我想分享一下过去两年中我自己的一些学习经历,希望你能更顺利地成为Linuxer. 两年前在Linux系统的运行和维护方面找到了一份工作( ...
- Unity3d-Particle System 5.x系统的学习(四)
Unity3d-Particle System 5.x系统的学习(四) 今天,我们来聊聊unity5.x的粒子系统和unity4.x粒子系统的区别. 我大致看了下,区别还是蛮多的,但是总体的粒子制作思 ...
- 安装虚拟机和Linux系统的学习
安装虚拟机和Linux系统的学习(随笔3) 1.安装虚拟机 首先我按着老师给的链接上的步骤一步一步安装VirtualBox,进行得十分顺利. 接着则是在虚拟机上安装Ubuntu. 然而安装完成以后按要 ...
随机推荐
- 第四章——Lock的使用
本章主要是讲解:使用Lock对象也能实现同步效果,而且使用起来更方便. 主要掌握两个方面: ReentrantLock类的使用 ReenTrantReadWriteLock类的使用
- lvs+keepalived和haproxy+heartbeat区别
最近一直在看一些高可用性的负载均衡方案,当然那些f5之类的硬件设备是玩不起也接触不到了.只能看这些for free的开源方案. 目前使用比较多的就是标题中提到的这两者,其实lvs和haproxy都是实 ...
- 用python做的windows和linx文件夹同步。解决自动同步、加快传输大量小文件的速度、更丰富的文件上传过滤设置。
现在工具不好用,用的pycharm自动同步,但对于git拉下来的新文件不能自动上传到linux,只有自己编辑过或者手动ctrl + s的文件才会自动同步.导致为了不遗漏文件,经常需要全量上传,速度非常 ...
- 问题:webservice浏览后 无法输入参数;结果:调试Web Service时不能输入参数的解决办法
使用.NET 开发Web Service,有一个很方便的功能就是可以通过IE直接测试Web Service.当你的Web Service的参数都是元数据类型,那么只要你使用IE浏览Web Servic ...
- 选择炸了(JIRA)的88个
作者:Martin Seibert SEIBERT MEDIA 首席执行官. 原文地址:http://seibert.biz/jirareasons 作者Martin Seibert 是德国互联网代理 ...
- [hdu1176]免费馅饼(数塔dp)
题意:中文题,不解释了 = = 解题关键:逆推,转化为数塔dp就可以了 dp[i][j]表示在i秒j位置的最大值. 转移方程:$dp[i][j] = \max (dp[i + 1][j],dp[i + ...
- 杭电acm 1033题
Problem Description For products that are wrapped in small packings it is necessary that the sheet o ...
- svn的revert、checkout、clean up、setting
svn revert 描述恢复所有对文件和目录的修改,并且解决所有的冲突状态. svn revert不会只是恢复工作拷贝中一个项目的内容,也包括了对属性修改的恢复.最终,你可以使用它来取消所有已经做过 ...
- Eclipse提交svn错误svn E210003 connection refused by the server
错误明细: org.apache.subversion.javahl.ClientException: svn: E210003: connection refused by the server o ...
- 某欧洲电信运营商OSS功能架构