唐山制作网站的,新站优化案例,国外做蒸汽锅炉的网站,北京网站制作公司排名vector的介绍及使用 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样#xff0c; vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问#xff0c;和数组一样高效。但是又不像数组#xff0c;它的大小是可以动态改变的…vector的介绍及使用 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样 vector 也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector 的元素进行访问和数组一样高效。但是又不像数组它的大小是可以动态改变的而且它的大小会被容器自动处理。 3. 本质讲 vector 使用动态分配数组来存储它的元素。当新元素插入时候这个数组需要被重新分配大小为了增加存储空间。其做法是分配一个新的数组然后将全部元素移到这个数组。就时间而言这是 一个相对代价高的任务因为每当一个新的元素加入到容器的时候vector并不会每次都重新分配大小。 4. vector 分配空间策略 vector 会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 5. 因此 vector 占用了更多的存储空间为了获得管理存储空间的能力并且以一种有效的方式动态增长。 6. 与其它动态序列容器相比 deque, list and forward_list vector 在访问元素的时候更加高效在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作效率更低。比起list 和 forward_list统一的迭代器和引用更好。 vector的定义 (1)vectorint a;//无参构造
(2)vectorint a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
(3)vectorint a(b); //用b向量来创建a向量整体复制性赋值拷贝构造
(4)vectorint a(b.begin(),b.begin3); //定义了a值为b中第0个到第2个共3个元素
(5) vectorint a(10); //定义了10个整型元素的向量尖括号中为元素类型名它可以是任何合法的数据类型初值默认0。
(6)int b[7]{1,2,3,4,5,9,8}; vectorint a(b,b7); //从数组中获得初值vector iterator 的使用 vector 空间增长问题 #includeiostream
using namespace std;
#includevectorint main()
{vectorint v;cout v.size()endl;//0cout v.capacity() endl;//0cout v.empty() endl;//1return 0;
} capacity 的代码在 vs 和 g 下分别运行会发现 vs 下 capacity 是按 1.5 倍增长的 g 是按 2 倍增长的 。 这个问题经常会考察不要固化的认为 vector 增容都是 2 倍具体增长多少是根据具体的需求定义的。vs 是 PJ 版本 STL g 是 SGI 版本 STL 。 reserve 只负责开辟空间如果确定知道需要用多少空间 reserve 可以缓解 vector 增容的代价缺陷问题。 resize 在开空间的同时还会进行初始化影响 size 。 #includeiostream
#includealgorithm
using namespace std;
#includevector
int main()
{// 测试vector的默认扩容机制size_t sz;vectorint v;sz v.capacity();cout making v grow:\n;for (int i 0; i 100; i){v.push_back(i);if (sz ! v.capacity()){sz v.capacity();cout capacity changed: sz \n;}}/*vs运行结果vs下使用的STL基本是按照1.5倍方式扩容making foo grow :capacity changed : 1capacity changed : 2capacity changed : 3capacity changed : 4capacity changed : 6capacity changed : 9capacity changed : 13capacity changed : 19capacity changed : 28capacity changed : 42capacity changed : 63capacity changed : 94capacity changed : 141g运行结果linux下使用的STL基本是按照2倍方式扩容making foo grow:capacity changed: 1capacity changed: 2capacity changed: 4capacity changed: 8capacity changed: 16capacity changed: 32capacity changed: 64capacity changed: 128*/return 0;
} resize 用法
a.resize(10); //将a的现有元素个数调至10个多则删少则补补的话其值默认0容量不变
a.resize(10,2); //将a的现有元素个数调至10个多则删少则补补的话其值为2容量不变#includeiostream
using namespace std;
#includevectorint main()
{vectorint v;v.resize(10);cout v[1] endl;//0cout v.size()endl;//10cout v.capacity() endl;//10return 0;
} reserve a.reserve(100); //将a的容量capacity扩充至100也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义因为这将避免内存多次容量扩充操作当a的容量不足时电脑会自动扩容当然这必然降低性能
#includeiostream
using namespace std;
#includevectorint main()
{vectorint v;v.reserve(10);cout v.size()endl;//0cout v.capacity() endl;//10return 0;
} vector 增删查改 a.push_back(5); //在a的最后一个向量后插入一个元素其值为5 a.pop_back(); //删除a向量的最后一个元素 a.insert(a.begin()1,5); //在a的第1个元素从第0个算起的位置插入数值5如a为1,2,3,4插入元素后为1,5,2,3,4a.insert(a.begin()1,3,5); //在a的第1个元素从第0个算起的位置插入3个数其值都为5a.insert(a.begin(), s.begin(), s.end());//在a的第0个元素从第0个算起的位置插入
s[begin,end)的元素a.insert(a.begin()1,b3,b6); //b为数组在a的第1个元素从第0个算起的位置插入b的
从第0个算起第3个元素到第5个元素不包括b6如b为1,2,3,4,5,9,8插入元素后1,4,5,9,2,3,4,5,9,8 a.erase(a.begin()1,a.begin()3); //删除a中第1个从第0个算起到第2个元素也就是说删除的元素从a.begin()1算起包括它一直到a.begin()3不包括它[begin()1,a.begin()3)a.erase(a.begin());//删除第0个元素a.swap(b); //b为向量将a中的元素和b中的元素进行整体性交换 #includeiostream
using namespace std;
#includevectorint main()
{vectorint v(10, 1);for (size_t i 0; i v.size(); i){cout v[i] ;//1 1 1 1 1 1 1 1 1 1}cout endl;return 0;
} 算法模块
头文件#includealgorithm不在vector中find(a.begin(),a.end(),10); //在a中的从a.begin()包括它到a.end()不包括它的元素中查找10若存在返回其在向量中的位置reverse(a.begin(),a.end()); //对a中的从a.begin()包括它到a.end()不包括它的元素倒置但不排列如a中元素为1,3,2,4,倒置后为4,2,3,1
[a.begin(),a.end()),左闭右开 sort(a.begin(),a.end()); //对a中的从a.begin()包括它到a.end()不包括它的元素进行从小到大排列 copy(a.begin(),a.end(),b.begin()1); //把a中的从a.begin()包括它到a.end()不包括它的元素复制到b中从b.begin()1的位置包括它开始复制覆盖掉原有元素 其他
shrink_to_fit 要求容器减少其容量以适应其尺寸适应有效数据个数 assign a.assign(b.begin(), b.begin()3); //b为向量将b的0~2位置的元素构成的向量赋给a
a.assign(4,2); //a只含4个元素且每个元素为2 vector非成员函数 会调用即可