STL之Vector容器
一、初识Vector容器
学习目标1:学会往Vector容器中添加内置数据类型和Vector容器的遍历
示例:
#include "iostream"
#include <vector>
#include <algorithm>
using namespace std;void print(int val)
{cout << val << endl;
}
void test01()
{vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);//通过迭代器访问容器中的数据vector<int>::iterator itBegin = v.begin(); vector<int>::iterator itEnd = v.end();//遍历方式一while (itBegin!=itEnd){cout << *itBegin << endl;itBegin++;}cout << "第二种遍历方式" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << endl;}cout << "第三种遍历方式:用STL中的算法遍历" << endl;for_each(v.begin(), v.end(), print);
}int main01()
{test01();system("pause");return 0;
}
学习目标2:往Vector容器中添加自定义数据类型与遍历
示例:
#include "iostream"
#include <string>
#include <vector>
using namespace std;//自定义数据库 类型class People
{
public://People() {};People(string name, int age){this->m_Name = name;this->m_Age = age;}void ShowPeoleInfo(){cout << "姓名:" << this->m_Name << "年龄:" << this->m_Age << endl;}string m_Name;int m_Age;
};void testPeople()
{//vector<People> arr;//People p1("小黄", 21);//People p2("小兰", 32);//People p3("小红", 41);//People p4("小名", 22);//People p5("小花", 12);//arr.push_back(p1);//arr.push_back(p2);//arr.push_back(p3);//arr.push_back(p4);//arr.push_back(p5);//cout << "Vector容器的当前容量是:" << arr.capacity() << endl;//cout << "Voctor容器的当前数据个数是:" << arr.size() << endl;遍历容器中的数据//for (vector<People>::iterator it = arr.begin(); it != arr.end(); it++)//{// //cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;// cout << "姓名:" << (*it).m_Name<<" " << "年龄:" << (*it).m_Age << endl;//}vector<People*> arr;People p1("小黄", 21);People p2("小兰", 32);People p3("小红", 41);People p4("小名", 22);People p5("小花", 12);arr.push_back(&p1);arr.push_back(&p2);arr.push_back(&p3);arr.push_back(&p4);arr.push_back(&p5);cout << "Vector容器的当前容量是:" << arr.capacity() << endl;cout << "Voctor容器的当前数据个数是:" << arr.size() << endl;//遍历容器中的数据for (vector<People*>::iterator it = arr.begin(); it != arr.end(); it++){//cout << "姓名:" << it->m_Name << "年龄:" << it->m_Age << endl;cout << "姓名:" << (*it)->m_Name << " " << "年龄:" << (*it)->m_Age << endl;}
}
int main()
{testPeople();system("pause");return 0;
}
学习目标3:容器中嵌套容器
示例:
#include "iostream"
#include <vector>
#include <string>using namespace std;//容器中嵌套容器
void test02()
{//1、***********定义一个大容器***********vector<vector<int>> V;//2、创建小容器vector<int> v1;vector<int> v2;vector<int> v3;vector<int> v4;//3、向小容器中添加数据for (int i = 0; i < 4; i++){v1.push_back(i);v2.push_back(i + 1);v3.push_back(i + 2);v4.push_back(i + 3);}//4、把小容器放到大容器中V.push_back(v1);V.push_back(v2);V.push_back(v3);V.push_back(v4);//5、遍历大容器中的所有数据for (vector<vector<int>>::iterator it = V.begin(); it != V.end(); it++){//(*it) ---是指vector<int>//再遍历每一个小容器中的数据cout << "遍历每个小容器的数据" << endl;for (vector<int>::iterator it1 = (*it).begin(); it1 != (*it).end(); it1++){cout << *it1 << endl;}}
}
int main()
{test02();system("pause");return 0;
}
二、vector容器的构造函数
学习目标:学会灵活使用vector容器的几种构造函数
vector容器与数组不同之处在于:空间可以动态扩展。
动态扩展:动态扩展并不是在原来的内存空间上扩展,而是寻找(开辟)更大的内存空间,把原来的数据拷贝到新空间,最后把原来的空间释放掉。
vector容器支持随机访问的迭代器。
vector函数原型:
vector<T> v; //采用模板实现类实现,默认构造函数
vector(v.begin(),v.end()) //将v[begin(),end())区间的元素拷贝给本身
vector(n,elem) //构造函数将n个elem拷贝给本身
vector(const vector &vec) //拷贝构造函数
示例:
#include "iostream"
#include <vector>#include <string>
using namespace std;
void printVector(vector<int> &v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it<<" ";}cout << endl;
}void test04()
{vector<int> v1; //1、默认构造参数for (int i = 1; i < 10; i++){v1.push_back(i);}printVector(v1); //1 2 3 4 5 6 7 8 9//2、通过区间的方式进行构造vector<int> v2(v1.begin(), v1.end());printVector(v2); //1 2 3 4 5 6 7 8 9//3、n个elem来构造vector<int> v3(10, 100);printVector(v3); //100 100 100 100 100 100 100 100 100 100//4、拷贝构造vector<int> v4(v3);printVector(v4); //100 100 100 100 100 100 100 100 100 100
}
int main()
{test04();system("pause");return 0;
}
三、vector容器的赋值操作
学习目标:学会利用几种原型函数给vector容器进行赋值
函数原型:
vector& operator=(const vector &vec) //重载等号赋值操作
assign(begin,end) //将[begin,end)区间的数据拷贝赋值给本身
assign(n,elem) //将n个elem拷贝赋值给本身
示例:
#include "iostream"
#include <vector>using namespace std;void PrintVector(vector<int> &v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}void test05()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}PrintVector(v);//1、等号进行赋值操作cout << "赋值操作 operator=" << endl;vector<int> v2;v2 = v;PrintVector(v2);//2、assignvector<int> v3;v3.assign(v.begin(), v.end());PrintVector(v3);//3、 assign n个elem进行赋值vector<int> v4;v4.assign(10, 100);PrintVector(v4);
}
int main()
{test05();system("pause");return 0;
}
总结:vector赋值最简单的方式是用等号进行赋值
四、vector容器的容量与大小操作
学习目标:能灵活对vector容器的容量与大小进行操作
函数原型:
empty(); //判断容器是否为空
capacity(); //获取容器的容量
size(); //获取容器中的元素个数
resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置
//若容器变短,则末尾超出容器长度的元素被删除
resize(int num,elem) //重新指定容器的长度为num,若容器变长,则以elem填充新位置
//若容器变短,则末尾超出容器长度的元素被删除
示例:
#include "iostream"
#include <vector>using namespace std;void PrintVector06(vector<int> &v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}void test06()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}PrintVector06(v); //0 1 2 3 4 5 6 7 8 9if (v.empty()) //为真代表容器为空{cout << "v容器为空!!!!" << endl;}else {cout << "v容器不不不为空!!!!" << endl;cout <<"v容器的容量是:"<< v.capacity() << endl;cout << "v容器的大小是:" << v.size() << endl;}//重新指定v容器的大小v.resize(15);PrintVector06(v); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0//v.resize(20,100);PrintVector06(v); //0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 100 100 100 100 100v.resize(2);PrintVector06(v); //0 1
}
int main()
{test06();system("pause");return 0;
}
五、vector容器的插入和删除操作
学习目标:能够进行vector容器的插入、删除操作
函数原型:
push_back(elem);
pop_back(); //删除最后一个元素
insert(const_iterator pos,elem); //迭代器指向位置pos插入元素elem
insert(const_iterator pos,int count,elem); //迭代器指向位置pos插入count个元素elem
erase(const_iterator pos); //删除迭代器指向的元素
erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素
clear(); //删除容器中所有元素
示例:
#include "iostream"
#include <vector>
using namespace std;void PrintVector07(vector<int> &v)
{if (v.empty()){cout << "容器为空!" << endl;}else {cout << "容器的容量为:"<<v.capacity() << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}}cout << endl;
}void test07()
{vector<int> v;//尾插法v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);PrintVector07(v); //10 20 30 40 50//尾删法v.pop_back();PrintVector07(v); //10 20 30 40//插入法 第一个参数是迭代器v.insert(v.begin(), 1000);PrintVector07(v); //1000 10 20 30 40v.insert(v.begin(), 2,1000);PrintVector07(v); //1000 1000 1000 10 20 30 40//删除v.erase(v.begin());PrintVector07(v); //1000 1000 10 20 30 40//v.erase(v.begin(), v.end());v.clear();PrintVector07(v); //输出为空}
int main()
{test07();system("pause");return 0;
}
总结:尾插、尾删、插入、删除、清空
六、vector数据的存取
学习目标:对vector容器中的数据进行存取操作
函数原型:
at(int index); //返回索引index所指的数据
operator[]; //返回索引index所指的数据
front(); //返回容器中第一个数据元素
back(); //返回容器中最后一个数据元素
示例:
#include "iostream"
#include <vector>using namespace std;void PrintVector08(vector<int> &v)
{if (v.empty()){cout << "容器为空!" << endl;}else{cout << "容器的容量为:" << v.capacity() << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}}cout << endl;
}void test08()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}//1、用[] 来访问容器中的元素for (int i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;//2、利用at方式来访问元素for (int i = 0; i < v.size(); i++){cout << v.at(i) << " ";}cout << endl;//3、获取容器中的第一个元素cout << "v容器中的第一个元素:" << v.front() << endl;//4、获取最后一个元素cout << "v容器的最后一个元素:" << v.back() << endl;
}int main()
{test08();system("pause");return 0;
}
七、vector容器互换
学习目标:实现两容器内的元素互换
函数原型:
swap(vec); //将vec与本身的元素互换
示例:
#include "iostream"
#include <vector>using namespace std;void PrintVector09(vector<int> &v)
{if (v.empty()){cout << "容器为空!" << endl;}else{cout << "容器的容量为:" << v.capacity() << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}}cout << endl;
}
void test09()
{vector<int> v1;for (int i = 0; i < 10; i++){v1.push_back(i);}cout << "交换前:"<<endl;PrintVector09(v1);vector<int> v2;for (int i =10; i >0; i--){v2.push_back(i);}PrintVector09(v2);cout << "交换后:" << endl;v1.swap(v2);PrintVector09(v1);PrintVector09(v2);
}//实际用途 巧用swap可以收缩内存空间
void test009()
{vector<int> v;for (int i = 0; i < 100000; i++){v.push_back(i);}cout << "v的容量为:" << v.capacity() << endl; //138255cout << "v的大小为:" << v.size() << endl; //100000v.resize(3); //重新指定大小cout << "v的容量为:" << v.capacity() << endl; //138255cout << "v的大小为:" << v.size() << endl; //3//巧用swap收缩内存vector<int>(v).swap(v); //vector<int>(v)匿名对象cout << "v的容量为:" << v.capacity() << endl; //3cout << "v的大小为:" << v.size() << endl; //3}
int main09()
{//test09();test009();system("pause");return 0;
}
总结:巧用swap收缩内存 vector<int>(v).swap(v)
八、vector预留空间
预留空间的作用:减少vector在动态扩展容量时的扩展次数
函数原型:
reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可以访问
示例:
#include "iostream"
#include <vector>
using namespace std;void test10()
{std::vector<int> v;v.reserve(100000);int num = 0;int *p = NULL;for (int i = 0; i < 100000; i++){v.push_back(i);if (p != &v[0]){p = &v[0];num++;}}cout << "num=" << num << endl; //未加v.reserve(100000); 30 进行了30次动态扩展cout << "num=" << num << endl; //加v.reserve(100000); 1 进行了1次动态扩展
}
int main10()
{test10();system("pause");return 0;
}
总结:如果一开始就知道数据量比较大,可以利用reserve预留空间
STL之Vector容器相关推荐
- C++STL的vector容器
C++STL的vector容器 vector容器 vector基本概念 vector构造函数 vector赋值操作 vector容量和大小 vector插入和删除 vector数据存取 vector互 ...
- 关于STL中vector容器的一些总结
第一个总结来自于http://www.jb51.net/article/41648.htm,第二个来自于http://www.cppblog.com/totti1006/archive/2009/09 ...
- C++STL中vector容器 assign()函数的用法
http://blog.sina.com.cn/s/blog_7b3a697301014aam.html assign函数: 函数原型: void assign(const_iterator firs ...
- STL 之 list 容器详解
STL之list容器详解 List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入 ...
- STL 之vector详解
STL之vector容器详解 vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样 ...
- java中vector容器,vector向量容器(常用的使用方法总结)
关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,还是想说看别人的代码一百遍,不如自己动手写一遍. vector向量容器不但能像数组一样对元素进行随机访问,还能随时在尾部插 ...
- STL中vector、list、deque和map的区别
vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy( ...
- STL中基本容器有: string、vector、list、deque、set、map
为什么80%的码农都做不了架构师?>>> 在STL中基本容器有: string.vector.list.deque.set.map set 和map都是无序的保存元素,只能通过 ...
- STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数
1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) A ...
最新文章
- SSM实现个人博客系统
- Spring学习笔记-注入实战篇
- computer vision(计算机视觉)方面的期刊会议,学术必备
- Delphi数据库编程一日通
- git仓库创建后,由主支变成开发分支
- 保护视力,我写的一个定时提醒的小玩意。
- 您的WebApp真的需要jQuery吗?
- 不讲武德,只用标签名就能做文本分类
- Hibernate Session get()vs load()的区别
- 解决方案:分布式ID生成
- 使用busybox制作iniramfs
- Madagascar的自定义浮点型函数--三角函数和反三角函数
- 4月第3周业务风控关注 | 文化部再次审查直播和游戏产品,已下架4939款直播应用...
- 小姐姐公开征婚高智商 IT 男:微信号竟要质数解密?
- 经典好文!java继承父类注解
- MS UC 2013-0-Prepare Tool
- (带手机版数据同步)高等院校学院学校类网站源码 政府单位学院学校网站织梦模板
- pandas安装了但是import不了
- android8临时root,Android8.0怎么root,刷supersu无穷重启
- ios 加载大量图片崩溃_iOS加载单张图片导致崩溃的分析
热门文章
- 何以解忧,唯有泡妞——我和聊天机器人有个约会
- vue实现动态星空效果
- Android 线程休眠方法
- 四、全国计算机二级Python考试——基本操作题(三)
- 计算机应用基础与操作,计算机应用基础教程与操作实例(Windows7+Office2010)/21世纪高等职业教育规划教材·计算机公共课系列...
- 利用for 语句求奇数,for语句,求奇数;
- Pr视频添加文字及改变文字大小和颜色方法
- 一个测试经理的工作总结
- 【AI-CPS】【工业机器人】焊接机器人培训PPT,工艺,缺陷,配置,讲得很详细!工业机器人实现柔性制造离不开的核心部件!
- python爬取有道词典json报错,求帮助!