std::vector 的 reserve, resize, clear, shrink_to_fit 的内存逻辑

作者: , 共 344 字 , 共阅读 0

std::vector有两个大小:

  • 一个是容量,和占用内存空间相关,即capacity()
  • 一个是数据大小,即size()

对应有两个操作:

  • reserve(n)会预留容量,如果n小于当前容量,什么也不会做。
  • resize(n)会调整数据大小,当n小于当前数据大小时,后面的数据将被清空,但容量不变;当n大于当前容量时,还会扩充容量。

clear()等价于resize(0),只清除数据,不清除空间,注意容量保持不变!这和clear的语意会有区别。如果要实现真正的清除(既清除数据,也清除空间),需要用下面两种方法:

  • v.clear()之后,再v.shrink_to_fit()
  • v.clear()之后,再std::vector<T>{}.swap(v)

Q. E. D.

类似文章:
编程 » folly, C++, 数据容器
由 Facebook 开发和维护的 C++库 Folly 提供folly::sorted_vector_setfolly::sorted_vector_map,是std::mapstd::set在小数据集上的优化版。代码见: https://github.com/facebook/folly/blob/master/folly/sorted_vector_types.h
编程 » folly, C++, 数据容器
由 Facebook 开发和维护的 C++库 Folly 提供folly::small_vector,代码文件地址:https://github.com/facebook/folly/blob/master/folly/small_vector.h
std::thread是 C++ 11 新引入的标准线程库。在同样是 C++ 11 新引入的 lambda 函数的辅助下,std::thread用起来特别方便:
编程 » C++, C++标准库
std::tuple的原理并不复杂,但有些细节非常有意思。其中有一个是至少在gnu C++ std的实现中,std::tuple是倒序存储的:
编程 » C++, 数据容器
我们知道在javascript以及Python 3.6+中,所有的dict都保留了插入顺序。但在 C++中,无论是std::map还是std::unordered_map,都没有保留插入顺序。当遍历时,std::map得到的是一个根据键值排序的有序序列,而std::unordered_map则基本是乱序。
看到网上有片段,提到没有必要自己实现自旋锁,因为标准库的 std::mutex 和现在的自旋锁的实现没有两样。比较好奇,翻了一些资料,试图找到答案。
编程 » C++, folly
folly::fbstring是一个完全兼容std::string的类,可以做到无缝替换,而且性能更高。其代码参见https://github.com/facebook/folly/blob/master/folly/FBString.h
编程 » C++, 数据容器, folly
folly::dynamic提供类似于C++的动态类型。和std::any可以容纳任意类型不一样,folly::dynamic只支持保存以下几种类型:
智能指针在现代 C++里用得越多。以前只知道它大致的原理,比如使用引用计数。但很多实现细节并不清楚,最直接的,它是如何实现多线程安全的?今天找了 gnu c++ library 的实现好好看了一下。
编程 » C++, 数据容器
我们知道在javascript以及Python 3.6+中,所有的dict都保留了插入顺序。但在 C++中,无论是std::map还是std::unordered_map,都没有保留插入顺序。当遍历时,std::map得到的是一个根据键值排序的有序序列,而std::unordered_map则基本是乱序。
这个路线和之前的10 公里大环线类似,水库沿山脊的路线因为植被过于茂密,以及有很多蜘蛛网,改成从水库直接上快活林。因此路程稍微短了一些。但这段路也很有意思,一直是一条小溪,特别有趣味和挑战。
跟着绿野的商业队伍去妫水河骑行,每人 198 元,惠新西街南口大巴接送往返。自行车取车地是世界葡萄博览园的南门。自驾也可以在此处租车,每车 150 元。