首页 > C++ STL的reserve函数

C++ STL的reserve函数

在阅读ceph源码过程中发现部分C++语法还是不够熟悉,特此做一下笔记。

关于STL中的reserve函数的使用

reserve()是为容器预留空间,即为当前容器设定一个空间分配的阈值,但是并不会为容器直接allocate具体的空间,具体空间的分配是在创建对象时候进行分配得

vector的reserve函数过程为例,直接看如下代码,其中主要用到的几个函数解释如下

  • capacity()获取当前容器的预留空间
  • size()获取当前容器的实际空间
  • erase()清除容器当前对象,也可以清除某一段区间内的对象。参数是迭代器类型
#include
#include
using namespace std;
int main()
{ /*根据最后的输出情况可以看到容器的实际物理空间size是根据push的次数进行的变化,而容器的容量vector是2倍容量增长的。当size为1的时候会直接预分配两个对象的空间,当size是3的时候直接预分配4个对象空间,当size是5的时候直接预分配8个对象空间。*/vector<int> test;cout << "get test capacity:"<< endl;int sz = test.capacity();for(int i =0; i< 100; ++i){ test.push_back(i);if(test.capacity() != sz) { cout << "test capacity changed " << test.capacity() << endl;cout << "test memory size " << test.size() << endl;sz = test.capacity();}}cout << "the size of test at last " << test.size() << endl;/*这里是上一个循环不同的地方,这里直接预留100个对象空间,并且进行reserve()预留空间之后对象空间容量将不会再增长,直到容器物理容量超过对象预留空间*/vector<int> test_reserve;cout << "get test_reserve capacity " << endl;sz = test_reserve.capacity();test_reserve.reserve(100);cout << "get test_reserve's size is " << test_reserve.size()  << "  " << test_reserve.capacity() << endl;for(int i = 0;i < 10; ++i) { test_reserve.push_back(i);if(test.capacity() != sz) { sz = test_reserve.capacity();}}cout << "get test_reserve capacity " << test_reserve.size() << endl;/*ps:执行erase函数会返回下一个迭代器地址指向的对象,所以这里不需要迭代器对象执行++操作,否则迭代器对象指针会跳跃通过最后的输出可以看到erase函数会清除对象,释放对象占用的物理空间,但是容器预留的空间并不会发生变化*/vector<int>::iterator itr = test_reserve.begin();for(;itr != test_reserve.end() ; ) { test_reserve.erase(itr);cout << "the vector size after erase : " << test_reserve.size() << " value is " << *itr << endl;cout << "the vector capacity after erase : " << test_reserve.capacity() << endl;}return 0;
}

output如下:

//第一次未预留空间 reserve的输出
get test capacity:
test capacity changed 1
test memory size 1
test capacity changed 2
test memory size 2
test capacity changed 4
test memory size 3
test capacity changed 8
test memory size 5
test capacity changed 16
test memory size 9
test capacity changed 32
test memory size 17
test capacity changed 64
test memory size 33
test capacity changed 128
test memory size 65
the size of test at last 100
//第二次设置reserve预留空间
get test_reserve capacity 
get test_reserve's size is 0  100
get test_reserve capacity 10
//使用erase函数之后查看容器实际容量和预留容量
the vector size after erase : 9 value is 1
the vector capacity after erase : 100
the vector size after erase : 8 value is 2
the vector capacity after erase : 100
the vector size after erase : 7 value is 3
the vector capacity after erase : 100
the vector size after erase : 6 value is 4
the vector capacity after erase : 100
the vector size after erase : 5 value is 5
the vector capacity after erase : 100
the vector size after erase : 4 value is 6
the vector capacity after erase : 100
the vector size after erase : 3 value is 7
the vector capacity after erase : 100
the vector size after erase : 2 value is 8
the vector capacity after erase : 100
the vector size after erase : 1 value is 9
the vector capacity after erase : 100
the vector size after erase : 0 value is 9
the vector capacity after erase : 100

更多相关:

  • 打开 build文件夹下面的webpack.base.conf.js; 找到下面这段代码,并将它注释掉: const createLintingRule = () => ({// test: /.(js|vue)$/,// loader: 'eslint-loader',// enforce: 'pre',// includ...

  • 写一个.cc文件,其中抱哈std::lock_guard以及std::thread等c++11特性,开始使用gcc编译,过程中出现如下问题 gcc test_lock.cc -o test_lock This file requires compiler and library support for the ISO C++ 201...

  • 第一种写法: 第二种写法:   转载于:https://www.cnblogs.com/w...

  • Rank() over()的用法 创建一个test表,并插入6条数据。 CREATE TABLE test (a INT,b INT,c CHAR ) INSERT INTO test VALUES(1,3,'E') INSERT INTO test VALUES(2,4,'A') INSERT INTO test VAL...

  • 1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...

  • size_t和int       size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef   unsigned int size_t; 而在64位架构中被定义为: typedef  unsigned lo...

  • 我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入...

  • 项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...

  • 具体过程为: ① 通过相机标定方法,预先计算相机的内参矩阵; ② 相邻帧特征点匹配,并结合内参矩阵计算本征矩阵; ③ 本征矩阵分解获得相机的外参矩阵[R | T],最终的相机移动距离等于矩阵T的Frobenius范数。 #include #include

  • 题目:二叉树中和为某一值的路径 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。 示例: 给定如下二叉树,以及目标和 sum = 22,               5              /             4   8    ...

  • begin函数: 函数原型: iterator begin(); const_iterator begin(); 功能: 返回一个当前vector容器中起始元素的迭代器。 end函数: 函数原型: iterator end(); const_iterator end(); 功能: 返回一个当前vector容器中末尾元素的迭代器。...

  • 文章目录前言vector的核心接口vector push_back实现vector 的 Allocatorvector 的 push_back总结...

  • 给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。 例如: 给定二叉树: [3,9,20,null,null,15,7] 3 / 9 20 / 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 方法一(非递归) 二叉树的层次遍历即二叉树的广度遍历,可以使...