1.vector容器介绍 向量(vector)是一个封装了动态大小数组的顺序容器(sequence container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
1.1 vector和普通数组区别 普通数组是静态的,在初始化是就确定空间大小,不支持动态扩展;
vector则可以看做是一个动态的数组,可以存放任意数据(基本数据类型和自定义数据类型均可以),支持动态扩展空间;
2.vector容器的构造函数 vector容器,可以看做是一个单端数组,构造函数有:无参构造、有参构造、拷贝构造。
vector 容器:--- >单端数组vector和普通数组的区别: 普通数组是静态空间,创建是就分配好 vector支持动态扩展vector容器常用迭代器: v.rend() -- >指向第一个元素的前一个位置 v.end() -- >指向最后一个元素的下一个位置 v.begin() -- >指向最后一个元素 vector容器的迭代器是支持随机访问的迭代器vector构造函数: 无参构造:vector v; 有参构造:vector(v.begin(),b.end()); --将begin到end之间的内容拷贝 vector(n,elem); //将n个elem内容拷贝 拷贝构造:vector(const vector &v); vector构造函数使用示例:
#include using namespace std;#include void printvector(const vector& ptr){ //若传入的vector是一个常量,则才是需要迭代器是需要使用:const_iterator for ( vector:: const_iterator v = ptr.begin(); v != ptr.end(); v++) { cout < < *v < < ; } cout < < endl;}void test(){ vector vtr;//默认构造 for (int i = 0; i < 5; i++) { vtr.push_back(i); } printvector(vtr); vector v2(vtr.begin(), vtr.end());//将begin~end之间的内容拷贝 printvector(v2); vector v3(10, 5);//赋值10个5 printvector(v3); vectorv4(v3);//拷贝构造 printvector(v4);}int main(){ test(); system(pause);} 3.vector赋值 vector赋值可以直接=赋值,也可以使用成员函数assign赋值。
vector赋值: vector &operator=(const vector &v);//重载= assign(beg,end);//将beg~end区间进行赋值 assign(n,elem);//n个elem赋值 赋值操作示例:
#include using namespace std;#include void printvector(const vector& p){ for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++) { cout < < *ptr< < ; } cout < < endl;}void test(){ vector v; for (int i = 0; i < 5; i++) { v.push_back(i); } printvector(v); vector v2 = v;//等号赋值 printvector(v2); vector v3(v.begin(), v.end());//区间赋值 printvector(v3); vector v4(5, 666);//5个666赋值 printvector(v4);}int main(){ test(); system(pause);} 4.vector获取容量和成员个数 vector和普通数组一样,下标是从0开始的。获取容量大小使用capacity()函数,判断容器是否为空可以使用empty()函数,获取成员个数使用size()函数。还可以使用resize函数指定容器大小;
vector容器的容量和成员个数:判断vector容器是否为空:empty()容量:capacity()容器中的元素个数:size()指定容器长度为num:resize(int num); 若容器变长,则以默认值填充,默认值为0 若容器变小,则末尾超出的元素将被删除指向容器的长度为num:resize(int num,elem); 若容器变长,则用elem填充 若容器变小,则末尾超出的元素将被删除 使用示例:
#include using namespace std;#include void printvector(const vector& p){ for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++) { cout < < *ptr < < ; } cout < < endl; cout < < 容量: < < p.capacity(); cout < < endl; cout < < 元素个数: < < p.size(); cout < < endl;}void test(){ vector vtr; for (int i = 0; i < 5; i++) { vtr.push_back(i); } printvector(vtr); //指定容器长度 vtr.resize(10,666);//指定长度为10,超出则用666填充 printvector(vtr); vtr.resize(3);//指定长度小于实际长度,则会删除超出的元素,但空间超出的空间还是存在 printvector(vtr); vectorv2; v2.resize(5);//没有指定填充值则默认为0 if (v2.empty()) { cout < < v2为空 < < endl; } printvector(v2);}int main(){ test(); system(pause);} 注意:在resize()函数时,若指定的大小比原空间大,则容器会进行扩充;若指定的大小比原空间小,则会将超出的成员删除,但空间大小不就删除。
5.vector容器成员删除与插入 vector容器是一个单端数组,通过bush_back()函数可以实现从末尾插入数据。
pop_back()从末尾删除数据;
从指定位置插入数据可以使用insert()成员函数,该函数有多个重载版本。
要从指定位置删除数据可以使用erase()成员函数,该函数有多个重载版本;
clear()函数实现清空容器。
vector插入与删除: push_back();//尾插 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 using namespace std;#include class person{ friend ostream& operatorname = p.name; return *this; }private: int age; string name;};ostream& operator< <(ostream& cout, const person &per){ cout < < 姓名: < < per.name < < t年龄: < < per.age; return cout;}void printvector(const vector& p){ for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++) { cout < < *ptr < < endl; }}void test(){ //实例化对象 person v1(18,小王); person v2(18, 小李); person v3(18, 小刘); person v4(18, 小陈); person v5(18, 小蒋); person v[5] = { v1,v2,v3,v4,v5 }; for (int i = 0; i < sizeof(v) / sizeof(v[0]); i++) { cout < < v[i] < < endl; } cout < < --------------------vector------------------- < < endl; //创建容器 vector vtr; //尾插 for (int i = 0; i < 5; i++) { vtr.push_back(v[i]);//赋值 } printvector(vtr); //尾删 cout < < t尾删 < < endl; vtr.pop_back(); printvector(vtr); //插入 cout < < t插入 < < endl; person temp(24, 老吕); vtr.insert(vtr.begin(), temp); printvector(vtr); cout < < t第三个位置插入3个值 < < endl; vector::iterator ptr = vtr.begin(); ptr += 3; vtr.insert(ptr, 3,temp); printvector(vtr); cout < < t删除首位置的值 < < endl; vtr.erase(vtr.begin()); printvector(vtr); cout < < t删除第3个位置到第6个位置的值 < < endl; ptr = vtr.begin(); vtr.erase(ptr+3, ptr+6); printvector(vtr); cout < < t清空 < < endl; vtr.clear();//或者使用vtr.erase(vtr.begin(),vtr.end); printvector(vtr); cout < < 空间大小: < < vtr.capacity(); cout < < endl; cout < < 元素个数: < < vtr.size(); cout < < endl;}int main(){ test(); system(pause);} 6.vector容器数据存取 vector容器也可以像普通数组一样同[]访问成员,此外还可以使用at()成员函数实现数据读写;
vector数据存取 at(int idx);//返回下标对应的内容 operator[];//重载[] front();//返回容器中第一个元素 back();//返回容器中最后一个元素 实现示例:
#include using namespace std;#include #include void printvector(int val){ cout < < val < < ;}void test(){ vector vtr; for (int i = 0; i < 5; i++) { vtr.push_back(i); } for_each(vtr.begin(), vtr.end(), printvector); cout < < endl; cout < < 第一个值: < < vtr.front() < < endl; cout < < 最后一个值: < < vtr.back() < < endl; vtr[0] = 100; cout < < vtr[0]= < < vtr.at(0) < < endl; }int main(){ test(); system(pause);} 7.vector容器互换元素 在vector容器中,可以通过成员函数swap()函数实现两个容器的成员互换。
注意:swap互换元素同时也可将空间大小进行互换。
vector容器互换swap(vec);//将vec中的元素和本身的元素互换注意:swap互换元素同时也可将空间大小进行互换 使用示例:
#include #include using namespace std;void printvector(const vector& p){ for (vector::const_iterator ptr = p.begin(); ptr != p.end(); ptr++) { cout < < *ptr < < ; } cout < < endl;}void test(){ vector vtr(10,666); vector vtr2; for (int i = 0; i < 5; i++) { vtr2.push_back(i); } cout < < t互换前 < < endl; printvector(vtr); printvector(vtr2); cout < < vtr大小: < < vtr.capacity() < < t元素个数:< vtr; //初始化 for (int i = 0; i < 100000; i++) { vtr.push_back(i); } cout < < vtr大小: < < vtr.capacity() < < t元素个数: < < vtr.size() < < endl; vtr.resize(5);//重新指定长度为5 cout < < vtr大小: < < vtr.capacity() < < t元素个数: < < vtr.size() < < endl; vector(vtr).swap(vtr); /* vector(vtr) --使用匿名对象,将匿名对象初始化为vtr vector(vtr).swap(vtr); --在通过swap函数和匿名对象互换,此时即可实现收缩内存 */ cout < < vtr大小: < < vtr.capacity() < < t元素个数: < < vtr.size() < < endl;}int main(){ test(); cout < < ------------------test02示例------------------------ < < endl; test02(); system(pause);}()< 由于swap函数不仅可以互换元素,而且空间也大小也是可以互换的,所以有些清空下可以使用swap()函数来合理使用空间,避免空间资源浪费。
8.vector容器预留空间 reserve()成员函数可以指定空间大小,为vector容器预留空间。
reserve函数和resize()函数区别:
resize()函数指定大小后会直接初始化空间;
reserve()函数指定的大小不会初始化空间,预留的空间不能直接访问,必须在赋值之后采用访问。
reserve(int len);//容器预留len长度的元素,预留位置初始化,元素不可访问 使用示例:
#include using namespace std;#include void test(){ vectorvtr; vtr.reserve(10); cout < < 空间大小: < < vtr.capacity() < < 元素个数:< vtr2; vtr2.resize(10);//指定长度 cout < < 空间大小: < < vtr2.capacity() < < 元素个数: < < vtr2.size() < < endl;}void test02(){ vector vtr; int* p=null; cout < < 不适用预留空间: < < endl; int num = 0; for (int i = 0; i < 100000; i++) { vtr.push_back(i); if (p != &vtr[0]) { p = &vtr[0]; num++; } } cout < < 动态扩展空间次数: < < num< vtr2; vtr2.reserve(100000);//预留100000空间 p = null; cout < < 使用预留空间: < < endl; num = 0; for (int i = 0; i < 100000; i++) { vtr2.push_back(i); if (p != &vtr2[0]) { p = &vtr2[0]; num++; } } cout < < 动态扩展空间次数: < < num < < endl;}int main(){ test(); cout < < t示例2: < ()< vector容器空间是根据成员来动态扩展,若一开始就知道使用的空间大概需要多大,则可以使用reserve()函数来指定,从而可以减少中间动态扩展的次数。
OpenWrt应用程序开发之minicom串口终端
瞄准大数据通信 泰克力推新系列高速码型发生器
spacex猎鹰9火箭成功发射 60颗Starlink卫星送上预定轨道
华为对印度市场重视程度不足,多种原因导致华为在印度市场再受挫
为什么选择矩阵式KVM切换器,它的原理分析
c++之vector容器
无人机解决方案助力马来西亚国家迅速发展
深耕智能汽车市场 以技术驱动行业发展
什么是安全隔离R型变压器?
AR体感互动的原理是怎样的
高通SW3100处理器将为手表市场带来什么样的改变
四款极具性价比的手机推荐:魅族Pro6 plus,荣耀9,小米6和一加5
中国微电子为何屡次更名转型
涅槃汽车: 智能座舱数据存储技术浅析
这样的iPhone8设计,又会让无数人折腰
DELL存储raid5阵列中2块盘离线的服务器数据恢复案例
为什么研究浮点加法运算,对FPGA实现方法很有必要?
荣耀magic v参数配置 荣耀magic v什么时候发布
比人驾驶安全性高?特斯拉全线投产无人驾驶汽车的自信在哪里?
深度解析什么是转置卷积