C++征途 --- Vector容器

第一部分 --- 基本概念

 

即创建一个新数组后,将旧数组的内容拷贝到新数组中,然后将旧数组占的内存空间释放,通过这种方式来实现动态扩展

1.上图就是一个vector容器的结构,当我们向一个vector容器中添加或是删除元素的时候都是采用尾插法和尾删法,而容器的最前端是保持封闭的,我们无法从最前端插数或是删数(vector容器中没有封装这样的方法) ---- 所以我们也称vector容器为单端数组

2.vector容器的迭代器是支持随机访问的迭代器


第二部分 --- Vector的构造函数

 1.注意第二种方法是的区间是前闭区间,后开区间(这是因为v.end()方法找到的位置是vector中最后一个元素的后一位,这个后一位我们是不能拷贝的)

且第二个方法是将另一个和新的vector容器具有相同泛型参数类型的vector容器中的所有元素拷贝到新的容器中

2.第三个方法中的elem数据的类型由vector的泛型参数是什么类型决定

 PS:调用容器的构造函数的方式和类一样,都是在实例化的对象后面加括号并在括号里传对应的参数

用的最多的方法是拷贝构造和默认构造  

注意!!关于拷贝构造的一些细节:

当我们创建一个容器的时候,这个容器的大小和容量都为0,只有在我们添加元素时才会发生改变

然后如果我们采用拷贝构造的方法来初始化容器的话,容器只会将作为参数传进来的容器的元素拷贝走,大小变的和它一样,然后根据这个大小扩展出合适的容量

也就是说!!初始化的容器和作为参数的容器之间大小一样,容量不一定一样


第三部分 --- 赋值操作

1.第一种是运算符重载赋值 --- 可以直接简写为 a = b

2.后两种都是vector容器中封装的成员函数

3.第二种方法和前面的第二个构造函数类似,都是将另一个容器的所有元素都拷贝到本身(只不过是采用区间的形式,之所以end为开区间则是因为容器中的end()方法获得的是容器中最后一个元素的后一位,而这个后一位是无法拷贝的,所以取开区间)

 

 

 注意!!这里都是进行赋值操作,也就是说是将vector容器中的旧数组替换为赋值过来的新数组


第四部分 --- Vector容量和大小

容量:capacity ; 大小:size ---- 容量指的是vector容器中的数组最多能装的元素个数,大小是指当前vector容器中的数组已经装载了多少个元素 --- 最多能装多少个元素(容量),已经装了的元素个数(大小)

1.第一个empty()方法 --- 如果容器为空返回一个ture,否则返回一个false

2.后面的resize方法是用来控制容器的大小而不是容量的,当我们传入的参数大于当前容器的大小时,就会将容器的大小扩大到给定参数,并将多出来的元素位置用默认值0来填充(重载方法可以让我们指定填充的值),如果参数小于大小的话,则会将多余的元素删除。

如果调用resize方法时传给resize的作为新大小的参数超过了当前容器的容量的话,则会先执行扩大容量然后再执行增大大小,其它情况下大小的改变对容量无影响。


第五部分 --- vector插入和删除

 注意插入的时候是向迭代器指向的位置pos插入元素

而且要注意的是这里进行的是插入操作,占据原本位置的元素会被往后推而不是被删除或者覆盖

倒数第二个删除方法是将两个迭代器指针之间及其本身指向的元素都删除掉

(关于insert和erase的参数,我们即可以传一个迭代器指针,也可以直接传容器中元素的地址(比如直接传通过vector容器中的begin方法获得的地址))


第六部分 --- Vector数据存取

 第二个方法就是通过类内重载下标访问运算符的方式来访问元素


第七部分 --- Vector互换容器

 传进来的参数vec是一个vector容器

一个容器调用这个方法并传一个容器作为函数参数后,就能够将两个容器的元素进行互换

能够互换的前提:两个容器的泛型参数类型一致(比如都得是int,double等等)

只要保证泛型参数类型一致,哪怕两个容器的容量/大小不一样也没关系,都可以再进行调整后(不需要我们手动调整,vector类中都已经封装好调整方法了)进行交换

注意这里的swap交换是指两个容器中封装数组指针指向的数组之间的交换,这样的交换意味着两个容器之间的大小和容量也会跟着发生交换

这个swap方法有一个实际的用途:

 首先我们引入一个情况:

我们知道vector容器是会随着我们放入的元素不断增多而自动扩充容量的,比如我们从1扩充到10000个元素的时候,容量就会变成一万三千多

此时如果我们用 resize 重新调整容器的大小为3的时候,容器的容量是不会随着大小的改变而改变的,这样就导致了一个问题,一个容量为一万三千多个元素的容器是很大的,但是在这个容器中我们只用了几个元素来装数据,这就导致容器的很多内存空间都被浪费了

为了避免浪费 --- 我们的解决方案是收缩容器的内存空间,而我们常用的收缩方法就是swap方法

 上面这行代码要分两步来理解:

第一步:

我们知道vector容器的本质是一个类模板,而的相关性质在类模板上依然使用,所以说我们也可以通过类模板创建一个匿名对象!!

1.匿名对象就是没有对象名的对象

2.然后这个匿名对象创建时也可以使用构造函数

3.匿名对象的创建语法是 类名直接加一个分号 这就可以创建一个匿名对象了

4.匿名对象最重要的一个特性:它只在执行创建它的那行代码时存在,代码执行结束后它就会被销毁

创建出一个匿名对象后我们就得到了一个容量为0,大小为0的vector容器,然后我们调用有参构造函数,并将大容量少元素的vector容器v作为参数传给构造函数

此时匿名对象会将vector容器v的元素都拷贝过来(即和vector容器v的大小一致),然后再根据获得的大小扩展出合适的容量

接着我们就可以执行

第二步:

通过匿名对象调用swap函数将vector容器v和匿名对象的数组进行交换,此时vector容器v将获得匿名和原来大小一致元素不变容量合适的数组,而匿名对象将会获得一个大小一致元素不变但是容量过大的数组(不过不用担心内存空间会被浪费,因为执行完这行代码后,匿名对象就会被销毁)

综上,我们就完成了vector容器v的内存收缩


第八部分 --- Vector预留空间

 

1.reserve方法的作用是给vector容器的容量进行初始化,使得容量一次性扩展为我们给定的函数参数(这个容量表示的是当前容器(数组)中最大能够存放的元素个数) 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL是指标准模板库(Standard Template Library),它是C++语言的一部分,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的目标是提供高效、可重用和可扩展的组件,以便开发人员能够更轻松地编写高质量的代码。STL包含了许多常见的数据结构,如vector、list、set、map等,以及各种算法,比如排序、查找、遍历等。通过使用STL,开发人员可以更加高效地处理各种数据结构和算法的问题,提高代码的开发效率和质量。 在STL中,我们可以使用各种容器来存储和管理数据。例如,我们可以使用std::map来创建一个键值对的映射,其中每个键都有一个与之相关联的值。下面是一个示例代码,展示了如何创建和使用一个std::map对象: std::map<std::string, int> disMap() { std::map<std::string, int> tempMap{ {"C语言教程",10},{"STL教程",20} }; return tempMap; } std::map<std::string, int> newMap(disMap()); 在这个示例中,disMap()函数创建了一个临时的std::map对象,并初始化了其中的一些键值对。然后,使用移动构造函数将这个临时对象移动到了一个新的std::map对象newMap中。最终,我们可以通过newMap对象来访问和操作这些键值对。 综上所述,STL是C++中的标准模板库,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的使用可以提高代码的开发效率和质量,并且通过各种容器和算法,可以方便地处理各种数据结构和算法的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL详解超全总结(快速入门STL)](https://blog.csdn.net/qq_50285142/article/details/114026148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++实验】阅读STL源码并分析](https://blog.csdn.net/qq_35760825/article/details/125311509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值