1.Vector容器简介

  • vector是将元素置于一个动态数组中加以管理的容器。
  • vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
  • vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时。

2.vector对象的默认构造

vector采用模板类实现,vector对象的默认构造形式

vector<T> vecT;

vector<int> vecInt;          //一个存放int的vector容器。

vector<float> vecFloat;     //一个存放float的vector容器。

3.vector对象的带参数构造

  • vector(beg,end);    //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
  • vector(n,elem);   //构造函数将n个elem拷贝给本身。
  • vector(const vector &vec);  //拷贝构造函数
 #include <iostream>
using namespace std;
#include <vector> void objPlay()
{
int iArray[] = { , , , , };
vector<int> vecIntA(iArray, iArray + );
vector<int> vecIntB(vecIntA.begin(), vecIntA.end()); //用构造函数初始化容器vecIntB
vector<int> vecIntB(vecIntA.begin(), vecIntA.begin() + );
vector<int> vecIntC(, ); //此代码运行后,容器vecIntB就存放3个元素,每个元素的值是9。
vector<int> vecIntD(vecIntA);
}
int main()
{
objPlay();
system("pause");
}

4.vector的赋值

  • vector.assign(beg,end);    //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
  • vector.assign(n,elem);  //将n个elem拷贝赋值给本身。
  • vector& operator=(const vector  &vec);          //重载等号操作符
  • vector.swap(vec);  // 将vec与本身的元素互换。
void objPlay2()
{
vector<int> vecIntA, vecIntB, vecIntC, vecIntD;
int iArray[] = { , , , , };
vecIntA.assign(iArray, iArray + );
vecIntB.assign(vecIntA.begin(), vecIntA.end()); //用其它容器的迭代器作参数。
vecIntC.assign(, );
vecIntD = vecIntA;
vecIntA.swap(vecIntD);
}

5.vector的大小

  • vector.size();         //返回容器中元素的个数
  • vector.empty();     //判断容器是否为空
  • vector.resize(num);   //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
  • vector.resize(num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
void objPlay3()
{
vector<int> vecInt;
int iArray[] = { , , };
int iSize = vecInt.size(); //iSize == 3;
bool bEmpty = vecInt.empty(); // bEmpty == false;
vecInt.resize(); //此时里面包含1,2,3,0,0元素。
vecInt.resize(, ); //此时里面包含1,2,3,0,0,3,3,3元素。
vecInt.resize(); //此时里面包含1,2元素。
}

6.vector末尾的添加移除操作

  • vector.push_back();//向容器的尾部插入元素
  • vector.pop_back();//从容器的尾部弹出元素
void objPlay4()
{
vector<int> vecInt;
vecInt.push_back(); //在容器尾部加入一个元素
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();//此时容器有5个元素,1,3,5,7,9
vecInt.pop_back(); //弹出尾部的一个元素
vecInt.pop_back(); //此时容器只有3个元素,1,3,5
}

7.vector的数据随机存取

  • vec.at(idx);    //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
  • vec[idx];          //返回索引idx所指的数据,越界时,运行直接报错
void objPlay5()
{
int iArray[] = { , , ,, };
vector<int> vecInt(iArray,iArray+); //包含1 ,3 ,5 ,7 ,9
vecInt.at() == vecInt[]; //
vecInt.at() = ; // 或 vecInt[2] = 8; int iF = vecInt.front(); //iF==1
int iB = vecInt.back(); //iB==9
vecInt.front() = ; //vecInt包含{11,3,8,7,9}
vecInt.back() = ; //vecInt包含{11,3,8,7,19}
}

8.vector的插入

  • vector.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • vector.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
  • vector.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值
void objPlay6()
{
vector<int> vecA;
vector<int> vecB; vecA.push_back();
vecA.push_back();
vecA.push_back();
vecA.push_back();
vecA.push_back(); vecB.push_back();
vecB.push_back();
vecB.push_back();
vecB.push_back(); vecA.insert(vecA.begin(), ); //{11, 1, 3, 5, 7, 9}
vecA.insert(vecA.begin() + , , ); //{11,33,33,1,3,5,7,9}
vecA.insert(vecA.begin(), vecB.begin(), vecB.end()); //{2,4,6,8,11,33,33,1,3,5,7,9}
}

9.vector的删除

  • vector.clear();      //移除容器的所有数据
  • vec.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
  • vec.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。
void objPlay7()
{
vector<int> vecInt;
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();//此时容器元素是1,3,5,7,9
vector<int>::iterator itBegin = vecInt.begin() + ;
vector<int>::iterator itEnd = vecInt.begin() + ;
vecInt.erase(itBegin, itEnd); //删除后 1,5,7,9(左闭右开)
for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end();) //小括号里不需写 ++it
{
if (*it == )
{
it = vecInt.erase(it); //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器 ,此处不能it++,因为删除后迭代器自动后移
}
else
{
++it;
}
}
//删除vecInt的所有元素
vecInt.clear(); //容器为空
}

10.迭代器基本原理

  • 迭代器是一个可遍历STL容器内全部或部分元素的对象。
  • 迭代器指出容器中的一个特定位置。
  • 迭代器就如同一个指针。
  • 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范围。

迭代器的分类

  输入迭代器:也有叫法称之为“只读迭代器”,它从容器中读取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列。

  输出迭代器:也有叫法称之为“只写迭代器”,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历一个序列。

  正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写。

  双向迭代器:组合正向迭代器的功能,还可以通过--操作符向后移动位置。

11.双向迭代器与随机访问迭代器

双向迭代器支持的操作:it++,  ++it,    it--,   --it,*it, itA = itB

随机访问迭代器支持的操作:it+=i, it-=i, it+i(或it=it+i),it[i]

void objPlay8()
{
vector<int> vecInt;
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();//此时容器元素是1,3,5,7,9
for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end(); ++it)
{
int iItem = *it;
cout << iItem; //或直接使用 cout << *it;
}
//打印出1 3 5 7 9
for (vector<int>::reverse_iterator rit = vecInt.rbegin(); rit != vecInt.rend(); ++rit) //注意,小括号内仍是++rit
{
int iItem = *rit;
cout << iItem; //或直接使用cout << *rit;
}
//打印出9, 7, 5, 3, 1
}

以上的完整版程序如下:

#include <iostream>
using namespace std;
#include <vector> void objPlay()
{
int iArray[] = { , , , , };
vector<int> vecIntA(iArray, iArray + );
vector<int> vecIntB(vecIntA.begin(), vecIntA.end()); //用构造函数初始化容器vecIntB
vector<int> vecIntC(vecIntA.begin(), vecIntA.begin() + );
vector<int> vecIntD(, ); //此代码运行后,容器vecIntB就存放3个元素,每个元素的值是9。
vector<int> vecIntE(vecIntA);
}
void objPlay2()
{
vector<int> vecIntA, vecIntB, vecIntC, vecIntD;
int iArray[] = { , , , , };
vecIntA.assign(iArray, iArray + );
vecIntB.assign(vecIntA.begin(), vecIntA.end()); //用其它容器的迭代器作参数。
vecIntC.assign(, );
vecIntD = vecIntA;
vecIntA.swap(vecIntD);
}
void objPlay3()
{
vector<int> vecInt;
int iArray[] = { , , };
int iSize = vecInt.size(); //iSize == 3;
bool bEmpty = vecInt.empty(); // bEmpty == false;
vecInt.resize(); //此时里面包含1,2,3,0,0元素。
vecInt.resize(, ); //此时里面包含1,2,3,0,0,3,3,3元素。
vecInt.resize(); //此时里面包含1,2元素。
}
void objPlay4()
{
vector<int> vecInt;
vecInt.push_back(); //在容器尾部加入一个元素
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();//此时容器有5个元素,1,3,5,7,9
vecInt.pop_back(); //弹出尾部的一个元素
vecInt.pop_back(); //此时容器只有3个元素,1,3,5
}
void objPlay5()
{
int iArray[] = { , , ,, };
vector<int> vecInt(iArray,iArray+); //包含1 ,3 ,5 ,7 ,9
vecInt.at() == vecInt[]; //
vecInt.at() = ; // 或 vecInt[2] = 8; int iF = vecInt.front(); //iF==1
int iB = vecInt.back(); //iB==9
vecInt.front() = ; //vecInt包含{11,3,8,7,9}
vecInt.back() = ; //vecInt包含{11,3,8,7,19}
}
void objPlay6()
{
vector<int> vecA;
vector<int> vecB; vecA.push_back();
vecA.push_back();
vecA.push_back();
vecA.push_back();
vecA.push_back(); vecB.push_back();
vecB.push_back();
vecB.push_back();
vecB.push_back(); vecA.insert(vecA.begin(), ); //{11, 1, 3, 5, 7, 9}
vecA.insert(vecA.begin() + , , ); //{11,33,33,1,3,5,7,9}
vecA.insert(vecA.begin(), vecB.begin(), vecB.end()); //{2,4,6,8,11,33,33,1,3,5,7,9}
}
void objPlay7()
{
vector<int> vecInt;
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();//此时容器元素是1,3,5,7,9
vector<int>::iterator itBegin = vecInt.begin() + ;
vector<int>::iterator itEnd = vecInt.begin() + ;
vecInt.erase(itBegin, itEnd); //删除了1,5,7,9
for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end();) //小括号里不需写 ++it
{
if (*it == )
{
it = vecInt.erase(it); //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器 ,此处不能it++,因为删除后迭代器自动后移
}
else
{
++it;
}
}
//删除vecInt的所有元素
vecInt.clear(); //容器为空
}
void objPlay8()
{
vector<int> vecInt;
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();
vecInt.push_back();//此时容器元素是1,3,5,7,9
for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end(); ++it)
{
int iItem = *it;
cout << iItem; //或直接使用 cout << *it;
}
//打印出1 3 5 7 9
for (vector<int>::reverse_iterator rit = vecInt.rbegin(); rit != vecInt.rend(); ++rit) //注意,小括号内仍是++rit
{
int iItem = *rit;
cout << iItem; //或直接使用cout << *rit;
}
//打印出9, 7, 5, 3, 1
}
int main()
{
objPlay();
objPlay2();
objPlay3();
objPlay4();
objPlay5();
objPlay6();
objPlay7();
objPlay8();
system("pause");
}

STL学习系列二:Vector容器的更多相关文章

  1. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  2. STL学习笔记(二) vector和string

    条款13:vector.string优先于动态分配数组 string是basic_string<char>的类型定义许多string的背后实现都采用了引用计数的技术,可以消除不必要的内存拷 ...

  3. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  4. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  5. Maven学习系列二(1-5)

    Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...

  6. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  7. DocX开源WORD操作组件的学习系列二

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  8. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  9. .net reactor 学习系列(二)---.net reactor界面各功能说明

    原文:.net reactor 学习系列(二)---.net reactor界面各功能说明         安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...

随机推荐

  1. Android ListView相关 头和尾 headView footerView

    ListView还可以添加头和尾部,而这头和尾就是View对象, 可以使用listView.addHeadView(view)方法和listView.addFootView(view)方法分别添加头和 ...

  2. Android面试宝典(转)

    Java知识点包括:接口与抽象的使用及区别,多线程,socket基础,集合类,也有个别公司考察定义,很无语. C/C++知识点包括:指针的移动,排序算法,链表,有时还会有二叉树的遍历或图的遍历. 1. ...

  3. [Unity菜鸟] 摄像机视角控制

    1. 摄像机预览物体 上下左右远近 把CameraFollow脚本赋给Camera,把要观察的对象赋给target using UnityEngine; using System.Collection ...

  4. Git教程之删除文件(8)

    在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:

  5. Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) ...

  6. PHP 如何阻止用户上传成人照片或者裸照

    在这份教程中,我们将会学习到如何阻止用户通过PHP上传成人照片或者裸照. 示例   下载 我在phpclasses.org上面偶然发现一个很有用的,由Bakr Alsharif开发的可以帮助开发者基于 ...

  7. caffe简易上手指南(一)—— 运行cifar例子

    简介 caffe是一个友好.易于上手的开源深度学习平台,主要用于图像的相关处理,可以支持CNN等多种深度学习网络. 基于caffe,开发者可以方便快速地开发简单的学习网络,用于分类.定位等任务,也可以 ...

  8. bzoj3996

    把这个式子弄清楚就知道这是最小割了 相当于,选某个点i有收入ai,i,会损失ci, 如果i,j都被选则有额外收入ai,j+aj,i 明显,对每个点i,连(s,i,∑ai,j) (i,t,ci) 对每对 ...

  9. bzoj1934 bzoj2768

    最小割的经典模型,体现出最小割的基本定义,把两个集合划分的最小代价 把一开始同意的人连源点,不同意的连汇点,有关系的人之间连边,流量都为1 不难发现,割两点(人)间的边就相当于朋友之间发生冲突 割到连 ...

  10. poj2182

    首先容易知道,最后一个数是最容易确定的,于是从后往前确定 对于位置j,它的数就是1~n中剩余数的第a[j]+1小的数 这当然可以用平衡数做,复杂度为O(nlogn) 有没有更简洁得算法?树状数组+二分 ...