【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。
“安置”函数比插入函数性能更好。
re:
1.
https://www.cnblogs.com/Braveliu/p/6622298.html
2.
https://blog.csdn.net/u010585135/article/details/44995079
3.
http://www.cnblogs.com/Braveliu/p/6264543.html
4.
https://blog.csdn.net/caroline_wendy/article/details/12967193
end