怎么做网站咨询,域名服务器查询,北京装修公司前十强,合肥房产网新楼盘✨✨✨学习的道路很枯燥#xff0c;希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载#xff08;Member functions#xff09; 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 v… ✨✨✨学习的道路很枯燥希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载Member functions 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 vector和string的区别 总结 前言
本篇详细介绍了vector的介绍及使用让使用者了解vector而不是仅仅停留在表面更好的模拟为了更好的使用. 文章可能出现错误如有请在评论区指正让我们一起交流共同进步 一、vector的介绍
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的使用
2.1.构造和赋值重载Member functions 我们用test1来展示用法
void Print(vectorint v)
{for (auto e : v){cout e ;}cout endl;
}
void test1()
{//无参构造vectorint v1;Print(v1);//有参构造构造并初始化n个valvectorint v2(5, 2);Print(v2);//有参构造n个位置调用T类型的默认构造vectorint v3(5);Print(v3);//拷贝构造vectorint v4(v3);Print(v4);//使用迭代器进行初始化构造(传string的迭代器区间)string s(hello world);vectorint v5(s.begin(), s.end());Print(v5);//使用迭代器进行初始化构造(传vctor的迭代器区间)vectorint v6(v5.begin(), v5.end());Print(v6);//赋值重载v1 v6;Print(v1);//特殊的赋值方式vectorint v7{ 1,2,3,4,5,6,7,8 };Print(v7);
} 虽然构造函数的本质是为了自定义类型而生的但是因为有了模版的存在在有些时候必须支持内置类型的默认构造
更好兼容的模板
PSC11新增 可变参数列表 即v7 Initializer_list是类模板
里面两个指针一个指向开头一个指向结尾 在C11中 {}新增一切皆可用花括号初始化 本意是好的但在使用过程中我们尽量用易于理解的写法
2.2 vector iterator 的使用 iterator的使用接口说明begin end重点获取第一个数据位置的iterator/const_iterator 获取最后一个数据的下一个位置 的iterator/const_iteratorrbegin rend获取最后一个数据位置的reverse_iterator获取第一个数据前一个位置的 reverse_iterato 同我们之前讲述的string基本相同故不再多言
2.3 vector 空间增长问题 这里和之前string的没什么差异
PS 1.capacity的代码在vs和g下分别运行会发现vs下capacity是按1.5倍增长的g是按2倍增长的。 这个问题经常会考察不要固化的认为vector增容都是2倍具体增长多少是根据具体的需求定义 的。vs是PJ版本STLg是SGI版本STL。 2.reserve只负责开辟空间如果确定知道需要用多少空间reserve可以缓解vector增容的代价缺陷问题。 3.resize在开空间的同时还会进行初始化影响size。 2.4 vector 增删查改 Vector里面并没有提供find但是算法库里有一个find是迭代器区间版本也就是说算法库里的find支持给STL所有容器使用体现了复用的价值 三 sort Sort是一个函数模板传的是容器的迭代器只支持随机迭代器迭代器功能分为3种一种是单向比如单链表一种是双向双向链表一种是随机Vector和String支持随机迭代器的一般都是支持下标访问的名字会暗示你要传什么样的迭代器。比如sort一般只支持随机迭代器而reverse一般支持双向迭代器但是随机迭代器也是可以的也就是说他们之间的关系是单向支持双向和随机双向支持随机随机谁也不能支持
默认升序传可调用对象可降序
浅浅介绍仿函数仿函数是对象greater和less
Greater支持两个数的比较 可通过greater实现降序
void test()
{vectorint v1{3,4,10,11,31,43,5464,4242432,22,3213};Print(v1);//升序sort(v1.begin(), v1.end(),lessint());Print(v1);//逆序sort(v1.begin(), v1.end(), greaterint());Print(v1);
}
四 vector和string的区别 思考有了Vectorchar还需要string吗毕竟我们也可以使用vectorchar来拥有字符数组 需要
1、如果用Vectorchar那其实底层又回到C语言的字符数组概念了我们封装string的原因就是字符数组不符合面向对象的思维。
2、vectorchar结尾不会带\0
3、vector的实现是可以存储很多种类型比较大小也是根据具体类型的比较方式去比较而string都是根据ascii码去比较。
4、的差别很大string一个字符串很正常但是Vector就不适合。
5、vector的接口不同于stringstring能更好的对字符和字符串数据进行处理而vector存储很多种类型不能专为string设计多个适合的接口 总结
✨✨✨各位读友本篇分享到内容是否更好的让你理解了C的vector类如果对你有帮助给个赞鼓励一下吧 世上没有绝望的处境只有对处境绝望的人。 感谢每一位一起走到这的伙伴我们可以一起交流进步一起加油吧。