结构体的vector resize()与初始化
序:
我们在使用vector的时候可以自定义里面的数据类型。例如这样:
struct Edge{
int from;
int to;
int weight;
};
vector<Edge> edge;
使用vector的使用我们有时会用到resize和reserve函数进行内存的分配。在之前的测试中我们发现先使用resize再用下标访问读取数据的效率要远远高于push_back()(测试结果见下),所以resize函数在初始化的时候会被使用。
关于vector push_back()与其他方式读取数据的效率对比
但是当我们真的调用resize函数的时候,编译器会报错:
edge.resize(0);
---
[Error] no matching function for call to 'Edge::Edge()'
[Note] candidates are:
难道是调用resize的时候格式出了问题吗?
但是却发现下面的:
vector<int> arc[maxn];
arc[i].resize(0);
却没有任何问题。
那么自定义结构体与int这类数据类型到底哪里不同?
后来我们发现加上它就不会报错了:
struct Edge{
int from;
int to;
int weight;
Edge(){} /* 重点在这里 */
Edge(int f, int t, int w):
from(f), to(t), weight(w){}/* 这个不是重点 */
};
原来当执行resize的时候,如果我们将它扩大,编译器会自动将剩下的部分初始化。int的初始化为0,但是我们自定义的结构体没有初始化函数。所以它无法执行。
类似的,当我们直接声明一个结构体数组的时候:
Edge edge[maxn];
发生报错的原因也在于此,由于vector在声明的时候不会执行初始化所以没有报错。但是声明一个数组,编译器会将整个数组初始化,这就需要你手写一个初始化的函数。(可以是空,也可以在里面写你要的特殊初始化,但是必须要有)而且这个初始化的函数参数是空的,函数名就是结构体的名字(你初始化的时候没有参数),跟普通的函数一个意思,只不过是写在了结构体的内部。
那么再看下面不是重点的那两行代码:
Edge(int f, int t, int w):
from(f), to(t), weight(w){}
这个就是有参数的初始化了。当你读入多个数据构造结构体的时候,这样做会让代码很简洁。
不用的话是这样的:
n = Get_Int(), m = Get_Int(), we = Get_Int();//读入优化
edge[i].from = n;
edge[i].to = m;
...
有了它代码会是这样的:
n = Get_Int ...; /* 输入同上 */
edge[i] = Edge(n, m, we);
明显简洁了很多。
自此结束。
箜瑟_qi 2017.04.22 11:35
结构体的vector resize()与初始化的更多相关文章
- C++重载流运算符,将存储结构体的vector直接写入文件
我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...
- Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.
转载:http://www.raysoftware.cn/?p=518&utm_source=tuicool 恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的 ...
- C语言_结构体的4种定义初始化方式及案例
结构体是一种构造数据类型 (构造数据类型:数组类型.结构体类型(struct).共用体类型(union)).用途:把不同类型的数据组合成一个整体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一 ...
- C语言中结构体(struct)的几种初始化方法
转自https://www.jb51.net/article/91456.htm 本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示 ...
- C基础--结构体成员初始化方式
之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下: 转自:http://www.cnblogs.com/Anke ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
- c结构体初始化问题
结构体中的数组的初始化问题 我的代码 C/C++ code #include <stdio.h> #include <stdlib.h> struct a { int leng ...
- C语言结构体指针初始化(转)
reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...
- Linux下C结构体初始化[总结]
1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...
随机推荐
- Http相关
1.http请求 http请求分为三部分:请求行,请求头,请求正文 1. 请求行 请求方式 GET POST 请求资源路径 协议版本 GET与POST请求区别? get只能传递1kb以下数据,P ...
- 功能总结之MongDB初探
题外话 工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈.用过的技术,就像猴子搬过的包谷,搬一个丢一个.几年风雨,真有点一缕清风过,片叶不沾身的味道. 为强化知识点,提升文档及学习能力,我把以 ...
- iOS开发之状态栏
从iOS7开始,状态栏默认情况下归控制器管理,比如状态栏的样式.状态栏的是否可见 控制器通过重写以下方法来控制状态栏 设置状态栏的样式,只需重写下列方法即可: - (UIStatusBarStyle) ...
- post和get请求的区别
post和get请求的区别: 1.post发送的数据在请求体中,用户看不到 get发送的数据在地址栏中 2.post请求中有content-type,作用是告诉服务器,发送给服务器的数据格式,是和ur ...
- JSTL标签用法 详解(转)
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- js正则表达test、exec和match的区别
test的用法和exec一致,只不过返回值是 true false. 以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用. 最近开发遇到一些 ...
- Yii2高级模板vendor和application非同级目录部署
上面是Yii2的高级模板,当我们有多个application的时候,这种高级模板可以可以提供很好的扩展性,多个application共用一份YII2框架,默认情况下,框架和application是在同 ...
- 自动化测试培训:设计和实现分布式QTP调用
自动化测试培训:设计和实现分布式QTP调用 自动化测试的过程中一个很核心的需求就是执行效率,单位时间里要执行更多的测试用例.为了完成该要求,我们开发一个调度工具,让qtp运行在不同的机器上,通过C ...
- DataTable源码分析(二)
DataTable源码分析(二) ===================== DataTable函数分析 ---------------- DataTable作为整个插件的入口,完成了整个表格的数据初 ...
- 关于C++ 循环
有的时分,可能需求屡次履行同一块代码.通常情况下,句子是顺序履行的:函数中的第一个句子先履行,接着是第二个句子,依此类推. 编程言语供给了答应更为杂乱的履行途径的多种操控结构. 循环句子答应咱们屡次履 ...