STL学习二:Vector容器
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); //拷贝构造函数

1 #include <iostream>
2 using namespace std;
3 #include <vector>
4
5 void objPlay()
6 {
7 int iArray[] = { 0, 1, 2, 3, 4 };
8 vector<int> vecIntA(iArray, iArray + 5);
9 vector<int> vecIntB(vecIntA.begin(), vecIntA.end()); //用构造函数初始化容器vecIntB
10 vector<int> vecIntB(vecIntA.begin(), vecIntA.begin() + 3);
11 vector<int> vecIntC(3, 9); //此代码运行后,容器vecIntB就存放3个元素,每个元素的值是9。
12 vector<int> vecIntD(vecIntA);
13 }
14 int main()
15 {
16 objPlay();
17 system("pause");
18 }

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[] = { 0, 1, 2, 3, 4 };
vecIntA.assign(iArray, iArray + 5);
vecIntB.assign(vecIntA.begin(), vecIntA.end()); //用其它容器的迭代器作参数。
vecIntC.assign(3, 9);
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[] = { 1, 2, 3 };
int iSize = vecInt.size(); //iSize == 3;
bool bEmpty = vecInt.empty(); // bEmpty == false;
vecInt.resize(5); //此时里面包含1,2,3,0,0元素。
vecInt.resize(8, 3); //此时里面包含1,2,3,0,0,3,3,3元素。
vecInt.resize(2); //此时里面包含1,2元素。
}

6.vector末尾的添加移除操作
- vector.push_back();//向容器的尾部插入元素
- vector.pop_back();//从容器的尾部弹出元素

void objPlay4()
{
vector<int> vecInt;
vecInt.push_back(1); //在容器尾部加入一个元素
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);//此时容器有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[] = { 1, 3, 5,7,9 };
vector<int> vecInt(iArray,iArray+5); //包含1 ,3 ,5 ,7 ,9
vecInt.at(2) == vecInt[2]; //5
vecInt.at(2) = 8; // 或 vecInt[2] = 8; int iF = vecInt.front(); //iF==1
int iB = vecInt.back(); //iB==9
vecInt.front() = 11; //vecInt包含{11,3,8,7,9}
vecInt.back() = 19; //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(1);
vecA.push_back(3);
vecA.push_back(5);
vecA.push_back(7);
vecA.push_back(9); vecB.push_back(2);
vecB.push_back(4);
vecB.push_back(6);
vecB.push_back(8); vecA.insert(vecA.begin(), 11); //{11, 1, 3, 5, 7, 9}
vecA.insert(vecA.begin() + 1, 2, 33); //{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(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);//此时容器元素是1,3,5,7,9
vector<int>::iterator itBegin = vecInt.begin() + 1;
vector<int>::iterator itEnd = vecInt.begin() + 2;
vecInt.erase(itBegin, itEnd); //删除后 1,5,7,9(左闭右开)
for (vector<int>::iterator it = vecInt.begin(); it != vecInt.end();) //小括号里不需写 ++it
{
if (*it == 3)
{
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(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);//此时容器元素是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
}
STL学习二:Vector容器的更多相关文章
- 侯捷STL学习(二)--序列容器测试
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
- C++STL库中vector容器常用应用
#include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...
- 侯捷STL学习(一)--顺序容器测试
开始跟着<STL源码剖析>的作者侯捷真人视频,学习STL,了解STL背后的真实故事! 视频链接:侯捷STL 还有很大其他视频需要的留言 第一节:STL版本和重要资源 STL和标准库的区别 ...
- STL学习笔记(一) 容器
0.前言随机访问迭代器: vector.string.dequeSTL的一个革命性的方面就是它的计算复杂性保证 条款01:慎重选择容器类型 c++提供的容器:标准STL序列容器:vector.stri ...
- C++学习二 vector的用法(使用sort对于vector排序)
一.vector的介绍 vector是C++里面的一个容器,也是我们数学上面理解的向量,有一些比较常见的操作. 二.vector的定义 #include<vector> using nam ...
- STL学习之vector
vector是一个线性顺序结构.相当于数组,但其大小可以不预先指定,并且自动扩展.它可以像指针一样被操作,由于它的特性我们完全可以将vector看做动态数组. 特点: 1.指定一块如同数组一样的连续存 ...
- STL学习笔记--特殊容器
容器配接器 (1) stack 栈 后进先出(LIFO), 头文件#include<stack> template<class _Ty, class _Container = deq ...
- STL学习笔记--各种容器的运用时机
如何选择最佳的容器类别? 缺省情况下应该使用vector.vector的内部结构简单,并允许随机存取,所以数据的存取十分方便灵活,数据的处理也够快. 如果经常要在序列的头部和尾部安插和移除元素,应采用 ...
- 侯捷STL学习(二)
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
随机推荐
- 自定义TabBarController报错 - Unbalanced calls to begin/end appearance transitions for <>
自定义了TabBarController 之后必须实现以下方法才能避免报错 -(void)viewWillAppear:(BOOL)animated { [self.selectedViewContr ...
- echo,printr,print_r之间的区别
echo 返回值是void,可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用.使用的 ...
- PHP中变量,常量,超级全局变量小结
//一般来说,变量在函数无法在函数体中无法访问,但是常量可以.//超级全局变量确实可以的,地址栏上的参数/*$GLOBALS //变量注册的信息$_GET //地址栏参数$_POST ...
- 让项目管理理论“落地”——读《IT项目经理成长手记》有感
最近利用业余时间阅读了一本好书--<IT项目经理成长手记>(潘东.韩秋泉著).本书的两位作者是神州数码(中国本土最大的整合IT服务提供商)的高管,在书中他们介绍了神州数码在IT项目管理领域 ...
- PHP JS判断浏览器,微信浏览器
微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mo ...
- 使用jquery插件报错:TypeError:$.browser is undefined的解决方法
关于$.browser browser就是用来获取浏览器基本信息的. jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.sup ...
- Cisco基本命令配置
实验一 路由器的基本命令操作 1 实验目标 ü 熟悉路由器的命令行操作 ü 能够使用命令行帮助 ü 能够查看路由器接口信息 ü 能够产看路由器配置信息 ü 能够配置以太网接口 ü 能够配置广域网接口 ...
- 网络HTTP、JSON、XML解析等 复习
一.一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器 2.请求参数:客户端发送给服务器的数据* 比如登录时需要发送的用户名和密码 3.返回结果:服务器返回给客户端的数据* 一般是 ...
- dateset是不是在缓存中
C#开发erp系统的时候有一个多表数据的查询展示到页面,采用了存储过程的方式,但是存储过程中没有加入分页(菜比).刚开始测试数据几百条没有问题,当数据量提升至十万级后页面加载速度就很卡了,一般是使用分 ...
- Eclipse的常用快捷方式
在开发中,常用的一些快捷方式 alt+shift+r 修改方法名,变量名,关键体会enter ctrl+shift+c 先选中n行,注释 ...