首页 > 其他分享 >STL容器vector应用注意事项

STL容器vector应用注意事项

时间:2022-10-05 20:06:10浏览次数:44  
标签:容器 函数 fit STL 元素 内存空间 vector 注意事项

 

 【1】提前分配足够空间以免不必要的重新分配和复制代价

 同样是push_back操作,预分配足够空间和不分配空间的时间代价显而易见。

【2】使用shrink_to_fit()释放vector占用的内存。(备注:clear() 和 erase()不会释放内存)

shrink to fit 压缩到合适的大小空间,即把多余的内存空间释放掉。

 通过上面的示例代码及运行输出结果分析可知:

1、erase和clear函数并不释放内存空间。执行两者后,容器的容量输出结果不变,说明并不会减少vector占用的内存空间。

2、shrink_to_fit压缩容器内存空间到合适大小(即capacity()容量等于元素个数size() )。

  2.1 由于vector容器是动态自动扩容的,但自动扩容的规则不保证每次增加空间后刚好能容纳所有元素而没有一点浪费。

所以,当元素填充完全后,为了释放多余的内存空间,可以调用shrink_to_fit函数达到目的。

  2.2 释放容器内存空间。一般人们总以为调用erase或clear后,容器内存空间也释放掉了,如上示例证明根本不是那么回事。

清理掉(erase或clear)容器所有元素之后,相当于容器元素个数为0,但容器容量仍不变(即内存空间仍存在)。

如果想释放掉容器内存空间,可以调用shrink_to_fit函数,使容器的容量值等于元素个数0。

注意:容器的容量值为0,意味着容器没有任何内存空间再可以填充元素,即释放了内存空间。

3、shrink_to_fit函数其本质同swap函数。

从示例代码中注释部分的shrink_to_fit函数原形可以看到,真正实现过程调用swap函数。

【3】填充或拷贝vector时,应该使用赋值而不是拷贝构造函数 或 insert()及 push_back()

从一个旧的vector取出元素填充另一个vector时,常有四种方式:

1、赋值构造函数。

2、拷贝构造函数。

3、基于迭代器的insert函数。

4、基于循环的push_back函数。

通过输出结果,可以看到vector赋值比insert和copy构造函数快,比push_back()更快。

为什么会这样?

赋值非常有效率,因为它知道要拷贝的vector有多大,然后只需要通过内存管理一次性拷贝vector内部的缓存。

所以,想高效填充vector:

首先应尝试使用assignment,然后再考虑基于迭代器的insert()或拷贝构造,最后考虑push_back。

【4】遍历vector元素时,避免使用迭代器。建议使用下标方式。

 相比较后,强烈建议使用下标或者at()成员函数,可见迭代器(迭代器的设计主要为了算法通用)的效率最低。

【5】尽量避免在vector前部插入元素。

任何在 vetor 前部部做的插入操作其复杂度都是 O(n) 的。

在前部插入数据十分低效,因为 vector 容器中的每个元素项都必须为新插入的元素项腾出空间而被复制移动。

如果在应用 vector 时需要从前部连续插入很多元素,那可能需要重新评估你的总体架构。 

【6】向vector容器插入元素时使用emplace_back而不是push_back。

“安置”函数比插入函数性能更好。

 


标签:容器,函数,fit,STL,元素,内存空间,vector,注意事项
From: https://blog.51cto.com/u_15711436/5732820

相关文章

  • STL学习笔记
    目录STL介绍什么是STL泛性编程STL基本组成STL序列式容器什么是STL容器什么是迭代器什么是序列式容器array容器vector容器deque容器list容器STL关联式容器pair容器map容器mu......
  • vector用法转载
    链接......
  • 02--SSTL模块注入+
     目录:SSTL模块注入    SSTL模块注入SSTI:python-flask模块注入原理:1、flask模块的渲染方法有render_template和render_template_string两种。render_templ......
  • 4、STL-函数对象
    4、STL-函数对象4.1函数对象4.1.1函数对象概念概念:重载函数调用操作符的类,其对象常称为函数对象函数对象使用重载()的时候,行为类似函数调用,也叫仿函数本质:函数对......
  • 3、STL-常用容器
    3、STL-常用容器3.1string容器3.1.1string容器的基本概念本质string是C++风格的字符串,而string本质上是一个类strting和char*的区别:char*是一个指针string......
  • where写布尔表达式的注意事项
    找出与“Smith”居住在同一城市、同一街道的所有客户的名字。--正确SELECT customer_nameFROM customerWHERE Customer_streetIN(SELECTCustomer_......
  • 栈的STL库
    栈的STL库stack用法(先进后出):#include<stack>stack<数据类型>名称;接口函数:push()插入一个元素到栈顶;top()返回顶层元素;pop()移除栈顶元素;size()返回栈中的元素......
  • STL
    迭代器迭代器本身可以看作一个数据指针。迭代器主要支持两个运算符:自增(++)和解引用(单目*运算符),其中自增用来移动迭代器,解引用可以获取或修改它指向的元素以$vecto......
  • c++ vector
    创建vectorvector的几个别名:向量、动态数组头文件:#include<vector>记得加上std命名空间,不然会报错usingnamespacestd;创建vectorvector<int>A;//一维动态数组......
  • array - vector- deque
    array  不支持动态的新增删除操作特点大小固定 无法增加或移除元素改变其大小      vector矢量(顺序表)   是封装动态数组的顺序容器 //缺点......