vector.clear()不能用来清零

vector.clear()函数并不会把所有元素清零,笔者就曾经这样幻想过这个函数的作用,然而事实证明并不是。

vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片区域所能容纳的元素个数。

通常capacity会比size大,如果往vector中push_back数据,这样就不用重新申请内存和拷贝元素到新内存区域了,便于节省时间。

所以vector.clear()的真正作用是:把size设置成0,capacity不变。

测试代码如下:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<vector<int>>res(12,vector<int>(12,0));//12行12列的vector
	int count=1;
	for(int i=0;i<12;i++)//给vector赋值,递增赋值
	{
		for(int j=0;j<12;j++)
		{
			res[i][j]=count;
			count++;
		}
	}
	cout<<res.size()<<res.capacity()<<endl;//这时候输出12和12
	res.clear();//清空res
	cout<<res.size()<<res.capacity()<<endl;//这时候输出0和12,也就是说size设置为0,capacity不变。
	for(int i=0;i<12;i++)//这时候输出res的内容,会发现前五个数字是一些杂乱无章的数字,后面就还好
	{
		for(int j=0;j<12;j++)
		{
			cout<<res[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

clear()的真正作用是改变size,capacity保持不变,不知道这块区域有没有在clear之后释放给内存去使用。

如果想要清零vector的话,还是得重新定义一个vector,或者用assign函数,示范代码如下:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<vector<int>>res(12,vector<int>(12,0));
	int count=1;
	for(int i=0;i<12;i++)//同样递增赋值
	{
		for(int j=0;j<12;j++)
		{
			res[i][j]=count;
			count++;
		}
	}
	cout<<res.size()<<res.capacity()<<endl;
	res.assign(12,vector<int>(12,0));//assign先删除掉res中的所有元素,接着插入12个vector<int>(12,0),时间花费还是大了点
	//res=vector<vector<int>>(12,0);//或者直接定义一个新的,赋给res。
	for(auto i:res)
	{
		for(int j:i)
		{
			cout<<j<<" ";
		}
		cout<<endl;
	}
	return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

Effective C++ 条款08:别让异常逃离析构函数

《Effective C++》第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常。多个异常同时存在的情况下,程序...

11040
来自专栏小樱的经验随笔

BugkuCTF 矛盾

15720
来自专栏HTML5学堂

面向对象系列讲解—面向对象的含义&工厂模式

HTML5学堂:在上一篇文章当中,我们把对象进行了基本的解释,本文当中,我将为大家解释什么是面向对象?为何要使用面向对象,而不用面向过程,面向对象又有什么好处,...

29360
来自专栏做全栈攻城狮

程序员带你十天快速入门Python,玩转电脑软件开发(四)

本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结。本篇文章主要是基于上一篇的程序员带你十天快速入门Pyth...

11540
来自专栏木子昭的博客

js的由弱变强之路,Flow为js添加编译过程

javascript是一门弱类型语言, 所谓弱类型, 就是一个变量既可以被赋值字符串, 数字, 又可以被赋值数组, 对象, 弱类型的好处很多, 但也有缺点, 比...

12730
来自专栏算法与数据结构

利用代码计算原码,反码和补码

11430
来自专栏Java爬坑系列

【JAVA零基础入门系列】Day11 Java中的类和对象

  今天要说的是Java中两个非常重要的概念——类和对象。   什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外在特征上,有名字,有年龄...

203100
来自专栏java学习

Java每日一练(2017/8/12)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

28340
来自专栏java一日一条

Java 中的十个”单行代码编程” ( One Liner )

本文列举了十个使用一行代码即可独立完成(不依赖其他代码)的业务逻辑,主要依赖的是Java8中的Lambda和Stream等新特性以及try-with-resou...

10220
来自专栏Phoenix的Android之旅

这是你在苦苦找寻的资料吗

趁着Java10发布的时候,小编将整理的有用的学习资料分享给大家,希望能有帮助。 下面说说刚发布的Java10.

9120

扫码关注云+社区

领取腾讯云代金券