STL:resize和reserve的区别【vector内存分配机制】

9 篇文章 0 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏
本文详细介绍了C++标准库中的vector容器成员函数resize和reserve的区别。resize不仅改变容器大小,还可能改变容量,而reserve仅调整容量,不改变元素数量。resize增加元素时,默认用0填充,resize减小尺寸时,超出部分的元素会被丢弃。reserve用于预先分配内存,避免频繁的内存重新分配,提高效率。
摘要由CSDN通过智能技术生成

vector:resize和reserve的区别

写在前面

为了区别这两个函数的功能,首先我们需要区别两个属性的概念。

  • capacity:发生 realloc 前能允许的最大元素数,即预分配的内存空间。预留位置不初始化,元素不可访问。
  • size:当前 vector 容器真实占用的大小,也就是容器当前拥有多少个元素。可以进行遍历。
  • capacity >= size。

ps:假设有一瓶容量为500ml的矿泉水,但是现在里面只装了300ml的水,那么capacity即为500,size即为300。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<bitset>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define PI acos(-1.0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define esp 1e-5
#define lowbit(x) x & (-x)

using namespace std;

const int maxx = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;

int n, m, T, N;
int a[3];
int l, r, ans;

int main(){
	int i, j, k;
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;;
	return 0;
}

在这里插入图片描述

二者的区别

  • resize():改变size的大小、也改变capacity的大小。容器内的对象内存空间是真正存在的。
  • reserver():只改变capacity的大小。容器内的对象并没有真实的内存空间。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<bitset>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define PI acos(-1.0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define esp 1e-5
#define lowbit(x) x & (-x)

using namespace std;

const int maxx = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;

int n, m, T, N;
int a[3];
int l, r, ans;

int main(){
	int i, j, k;
	vector<int> v1;
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	cout << "----------------------" << endl;
	vector<int> v2;
	v2.reserve(100);
	cout << "vector capacity: " << v2.capacity() << endl;
	cout << "vector size: " << v2.size() << endl;
	cout << "----------------------" << endl;
	vector<int> v3;
	v3.resize(100);
	cout << "vector capacity: " << v3.capacity() << endl;
	cout << "vector size: " << v3.size() << endl;
	cout << "----------------------" << endl;
	vector<int> v4;
	v4.push_back(1);
	v4.push_back(2);
	v4.push_back(3);
	v4.push_back(4);
	v4.push_back(5);
	cout << "vector capacity: " << v4.capacity() << endl;
	cout << "vector size: " << v4.size() << endl;
	v4.resize(50);
	cout << "vector capacity: " << v4.capacity() << endl;
	cout << "vector size: " << v4.size() << endl;
	return 0;
}

在这里插入图片描述

注意事项

  • 使用 reserve()之后,此后在使用 [ ] 操作符访问容器内的对象,很可能出现数组越界的问题。要保证迭代范围小于size。

  • 用[ ]访问,vector 退化为数组,不会进行越界的判断。此时推荐使用 at(),会先进行越界检查。

  • capacity 属性的容器只有 vector 和 string, list、map、set、deque这些容器的内存是散列分布的,因此不会发生类似 realloc() 的调用情况。

  • v1.resize(x),if(x < v1.size() )。则v1.size = x。多于的元素会被丢弃。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<bitset>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define PI acos(-1.0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define esp 1e-5
#define lowbit(x) x & (-x)

using namespace std;

const int maxx = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;

int n, m, T, N;
int a[3];
int l, r, ans;

int main(){
	int i, j, k;
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	for(auto i : v1){
		cout << i << " ";
	}
	cout << endl;
	v1.resize(3);
	for(auto i : v1){
		cout << i << " ";
	}
	cout << endl;
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	return 0;
}

在这里插入图片描述

  • v1.resize(x),if(x > v1.size() )。则v1.size = x,添加进来的元素默认用0进行填充。【使用v1.resize(x, y),则会用y来填充】。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<bitset>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define PI acos(-1.0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define esp 1e-5
#define lowbit(x) x & (-x)

using namespace std;

const int maxx = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;

int n, m, T, N;
int a[3];
int l, r, ans;

int main(){
	int i, j, k;
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	for(auto i : v1){
		cout << i << " ";
	}
	cout << endl;
	v1.resize(7); //默认0填充
	//v1.resize(7, 1)//用1进行填充
	for(auto i : v1){
		cout << i << " ";
	}
	cout << endl;
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	return 0;
}

在这里插入图片描述
在这里插入图片描述

  • v1.resize(x),if(x > v1.capacity() )。则v1.size = x,添加进来的元素默认用0进行填充,同时会进行内存分配。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<bitset>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define PI acos(-1.0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define esp 1e-5
#define lowbit(x) x & (-x)

using namespace std;

const int maxx = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;

int n, m, T, N;
int a[3];
int l, r, ans;

int main(){
	int i, j, k;
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	v1.push_back(5);
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	for(auto i : v1){
		cout << i << " ";
	}
	cout << endl;
	v1.resize(10);
	for(auto i : v1){
		cout << i << " ";
	}
	cout << endl;
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	return 0;
}

在这里插入图片描述

vector内存分配

  • vector内存分配机制:当空间不够装下数据时,会自动申请另一片更大的空间(1.5倍或者2倍),然后把原来的数据拷贝到新的内存空间,接着释放原来的那片空间【为了避免不必要的拷贝,每次可以在创建vector对象的时候指定vector的capacity】。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<iostream>
#include<bitset>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define PI acos(-1.0)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define esp 1e-5
#define lowbit(x) x & (-x)

using namespace std;

const int maxx = 1e6 + 5;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll INF = 0x3f3f3f3f3f3f3f3f;

int n, m, T, N;
int a[3];
int l, r, ans;

int main(){
	int i, j, k;
	vector<int> v1;
	cout << "vector capacity: " << v1.capacity() << endl;
	cout << "vector size: " << v1.size() << endl;
	int num = 0;
	int *p = NULL;
	for(int i = 0; i < 100000; i++){
		v1.push_back(i);
		if(p != &v1[0]){
			p = &v1[0];
			num++;
		}
	}
	cout << "内存分配次数:" << num << endl;
	return 0;
}

在这里插入图片描述

STLresize和reserve区别
希望我的博客,能帮上你解决学习中工作中所遇到的问题
02-12 809
首先,两个函数的功能是有区别的: reserve是容器预留空间, 但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。 resize是改变容器的大小,并且创建对象, 因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。 其次,两个函数的形式是有区别的: reserve函数之后一个参数,即需要预留的容器的空间; resize函数可以有两个参数,第一个
vectorreserveresize区别
wuxiecsdn的博客
03-09 4035
vectorreserveresize区别 一、基本概念 1、capacity 指容器在分配新的存储空间之前能存储的元素总数。 2、size 指当前容器所存储的元素个数 二、reserveresize 1.区别 1、reserve()只修改capacity大小,不修改size大小, 2、resize()既修改capacity大小,也修改size大小。 注意:resize只会在修改后的size()大小大于当前capacity()大小时才会修改capacity大小,比如下面情况就不会修改capacity
vector容器 reserveresize; size()和capacity()区别详解
weixin_43277501的博客
10-22 927
1、resize一个vector,相当于给其创建了n个元素,可以直接访问。 2、reverse的话,相当于申请了n个元素的空间,不可以直接访问,当push_back的时候,就是把元素放到这些空间里。 同时牵扯到size()和capacity()的区别,size()相当于已经拥有的元素大小,而capacity()是能够装下的元素大小,当前可能并没有那么多元素,对应reverse。 错误案例:以下语法...
vector的reserveresize
FrankyT1986的专栏
05-02 332
vector 的reserve增加了vectorcapacity,但是它的size没有改变!而resize改变了vectorcapacity同时也增加了它的size! 原因如下:       reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。       r
C++编程:多线程环境下std::vector内存越界导致的coredump问题分析
最新发布
Where there is life, there is hope.
09-18 926
多线程访问共享数据时,必须使用同步机制来防止数据竞争和内存越界,这是避免coredump的关键。内存越界是C++导致段错误和程序崩溃的常见原因,不能依赖时序问题来规避。建议严格使用同步工具如`std::mutex`,并进行定期代码审查和多线程测试,确保线程安全。
Resize 和 Reserve区别
island1314的博客
05-30 1093
resize()影响size(),在需要扩容时会影响到capacity()。reserve()影响capacity(),不会影响size()。
resize和reserve区别
Serven的博客
04-29 1901
resize和reserve区别和联系
reserve resize区别
weixin_40611076的博客
04-28 2274
首先必须弄清楚两个概念: 1.capacity 指容器在分配新的存储空间之前能存储的元素总数。 2. size 指当前容器所存储的元素个数 在弄清这两个概念以后,很容易懂resize和reserve区别 1).reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。 resize既分配了空间,也创建...
std::vector的reserveresize与堆内存破坏
cteng的专栏
03-17 5492
今天费了一个下午调试一个诡异的内存崩溃问题(coredump)基本上可以稳定复现,但会有不同。经分析崩溃栈,发现都是malloc内存时出现了signal 11段错误?分配内存时崩溃有可能是传入了非法size值,比如说-1或者0什么的,但那种情况下会抛bad alloc异常,或者返回空指针。起初怀疑是std::string的默认allocator的问题,甚至怀疑是全局变量未初始化导致的问题。。。但是...
C++ vector容器详解:resize与reserve区别
- 为了提高效率,`vector`通常会预留一些额外的空间,以避免频繁的内存分配。 4. **resize和reserve方法** - **resize()** 方法用于改变`vector`的大小。如果新的大小大于当前大小,`resize()`会用默认构造函数或...
resize和reserver的区别
YanWenCheng_的博客
01-19 1089
1、resize(n) 调整容器的长度大小,使其能容纳n个元素。 如果n小于容器的当前的size,则删除多出来的元素。 否则,添加采用值初始化的元素。 2、 resize(n,t) 多一个参数t,将所有新添加的元素初始化为t。 而reserver()的用法只有一种 reserve(n) 预分配n个元素的存储空间。 了解这两个函数的区别,首先要搞清楚容器的capacity(容量)与size(长度)的...
C++】reserve( ) 和resize( ) 函数的区别(小结)
ly_6699的博客
04-30 3328
**显然,** reserveresize的共同点如下: - 当 填写的n值<=当前值 时,都不会缩减容器本身的容量,即对原内存空间并无影响。 - 当 填写的n值>当前值 时,都会增大容器本身的容量 即capacity会变化。 reserveresize区别点如下: - reserve在不能改变容器容量时,什么都不做;reserve在能改变容器容量时,只会增加capacity即容器冗余量,但容器的size不会变化。 - resize在不能改变容器容量的时候,有可能增加/减少了元素个数即size(
resize()和reserve()比较,及使用resize初始化一维vector和二维vector
qq_40467670的博客
05-13 1191
首先,我们要明确在这里比较一下两个常见又相似,容易让人混淆的两个函数,一个是resize()函数,另一个是reserve()函数。 比较: resize():改变vector元素的数目,使用这个函数之后,就已经分配它的内存大小。 reserve():设置这个vector的容量大小,和resize()的区别在于,使用这个函数之后,此时还并没有真正分配内存。 用法区别resize():有两种用法,第一种,只传一个参数,即给定容器大小,此时默认初始值为0;第二种,传递两个参数,第一个是容器大小,第二个是初始
c++】reserveresize区别
这个人很勤快,但还是什么也没有。
01-21 1351
我创建了一个空字符串s3,可见默认给的capacity(有效字符容量)就是15,说明vs在写string类时,给了缺省值15。在s1我想保留20个字节的空间,编译器为我预留了31(32,还有一个'\0')字节的空间,而不是整20字节。在s2我想保留10个字节的空间,编译器为我预留了15(16,同上)字节的空间,而不是我想要的10字节。综上,可以得出resize的作用是改变字符串的size,如果给定的n比size小,那就截断;由此可知,编译器在字符串剩下的空间不够用时一般进行的是1.5倍扩容。
STLresize()与reserve()的区别
sunflower_della的博客
05-06 680
首先了解2个概念: size指容器当前拥有的元素个数, capacity则指容器在必须分配新存储空间之前可以存储的元素总数,即预分配存储空间的大小。 vector的存放有3种 1.普通:vecotr<int> V1; for(int i = 0; i < 100; ++i) { V1.push_back(1); } 效率最低。每push_ba...
容器resize和reserve区别
hjs316939150的专栏
12-21 460
初始化vector  va(10,100). va.resize(5):则只取前5个数,删除向量的后5位数,va.size()=5! va.resize(20):前10位保持值不变,后10位创建对象并初始化为0,va.size()=20! va.reserve(5):未改变,va.size()=10,va.capability()=10; va.reserve(20):未改变,va
C++resize和reserve区别
热门推荐
yishizuofei的博客
07-11 1万+
首先分清楚两个概念: 1.capacity:该值在容器初始化时赋值,指的是容器能够容纳的最大的元素的个数。还不能通过下标等访问,因为此时容器还没有创建任何对象。 2.size:指的是此时容器实际的元素个数。可以通过下标访问0-(size-1)范围内的对象。 就比如说一个瓶子的容量是600ml,意思是它最多可以装600ml,而不是说现在瓶子里就有600ml,这里的600ml就相当于capacit...
c++:reserveresize简介和区别
qq_62718027的博客
07-06 3210
目录reserveresize:总结:首先我们需要认清楚两个概念capacity和size.举一个例子,这里有半瓶1L的矿泉水。那么1L就是我们说的容量,也就是capacity,表示指容器在内存开辟的存储空间的总大小。半瓶,也就是500ML,也就是size,表示已经使用的空间大小。理解了这个之后我们下面对两个函数分别进行介绍一:函数原型 1.如果n>capacity,那么就在内存空间重新分配一块更大的连续空间,然后将容器内所有的有效元素从旧空间的位置全部复制到新空间相应的位置,然后释放旧空间,指向
写文章

热门文章

  • 组合类构造函数、析构函数、拷贝构造函数的调用顺序 1625
  • C++:const + 引用传递参数 1321
  • 构造函数初始化列表初始化成员变量的顺序 898
  • docker备忘 669
  • 组合类构造函数初始化列表初始化成员变量的顺序 655

分类专栏

  • 云原生 1篇
  • Go-client
  • docker 1篇
  • 刷题指南 30篇
  • PAT 5篇
  • Codeforces 2篇
  • LeetCode 24篇
  • c/c++ 9篇
  • STL 2篇
  • 实习经历 1篇

最新评论

  • 组合类构造函数、析构函数、拷贝构造函数的调用顺序

    Z ZStasis: 详细强无敌

  • 组合类构造函数、析构函数、拷贝构造函数的调用顺序

    忆书卿: 懂了表情包

  • 组合类构造函数、析构函数、拷贝构造函数的调用顺序

    青争911: 真不错表情包

  • 每日三题day1:LeetCode

    k↑: 一起加油哦

  • 每日三题day1:LeetCode

    大家一起学编程(python): 遇到好文章,我就是要评论,嘿,就是玩

最新文章

  • docker备忘
  • 每日三题day1:LeetCode
  • 每日一题day6:[LeetCode:75、39、322、347、142]
2022年1篇
2021年40篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家益阳玻璃钢雕塑中山玻璃钢雕塑有限公司河南大型商场美陈有哪些北海玻璃钢雕塑公司山东动物玻璃钢雕塑多少钱西安公园玻璃钢雕塑湖北定制玻璃钢雕塑设计武汉中山玻璃钢雕塑白云玻璃钢雕塑明光玻璃钢羊年雕塑珠海自发光动物玻璃钢雕塑厂家成都步行街玻璃钢雕塑优势大连玻璃钢雕塑价格玻璃钢仿铜雕塑哪家合适手糊玻璃钢雕塑工艺冀州玻璃钢卡通雕塑淘宝商场美陈合肥玻璃钢考拉雕塑哪家好玻璃钢雕塑适合摆放吗平凉商场美陈道具石家庄动物玻璃钢雕塑厂家抚州个性化玻璃钢雕塑四川玻璃钢蓝精灵雕塑车玻璃钢雕塑定制厂家福建室内商场美陈厂家直销河北组合式玻璃钢花盆玻璃钢雕塑代工厂河南玻璃钢金属雕塑公司呈贡玻璃钢雕塑的设计玻璃钢雕塑雕塑厂家香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化