序:
我们在使用vector的时候可以自定义里面的数据类型。例如这样:

struct Edge{
int from;
int to;
int weight;
};
vector<Edge> edge;

使用vector的使用我们有时会用到resizereserve函数进行内存的分配。在之前的测试中我们发现先使用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);

明显简洁了很多。

fread读入优化,寻找速度极限


自此结束。

箜瑟_qi 2017.04.22 11:35

结构体的vector resize()与初始化的更多相关文章

  1. C++重载流运算符,将存储结构体的vector直接写入文件

    我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次 ...

  2. Delphi结构体的扩展,可以自动初始化,反初始化,自定义拷贝函数.

    转载:http://www.raysoftware.cn/?p=518&utm_source=tuicool 恭贺Delphi XE7诞生,Delphi XE7在编译器内部集成了我之前所实现的 ...

  3. C语言_结构体的4种定义初始化方式及案例

    结构体是一种构造数据类型 (构造数据类型:数组类型.结构体类型(struct).共用体类型(union)).用途:把不同类型的数据组合成一个整体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一 ...

  4. C语言中结构体(struct)的几种初始化方法

    转自https://www.jb51.net/article/91456.htm     本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示 ...

  5. C基础--结构体成员初始化方式

    之前在linux内核代码中看到结构体成员成员初始化使用类似于.owner = THIS_MODULE, 不太见过,于是搜了个博客,分享下: 转自:http://www.cnblogs.com/Anke ...

  6. c语言结构体指针初始化

    今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...

  7. c结构体初始化问题

    结构体中的数组的初始化问题 我的代码 C/C++ code #include <stdio.h> #include <stdlib.h> struct a { int leng ...

  8. C语言结构体指针初始化(转)

    reference: https://www.cnblogs.com/losesea/archive/2012/11/15/2772526.html 今天来讨论一下C中的内存管理. 记得上周在饭桌上和 ...

  9. Linux下C结构体初始化[总结]

    1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...

随机推荐

  1. 玩转Node.js单元测试

    代码部署之前,进行一定的单元测试是十分必要的,这样能够有效并且持续保证代码质量.而实践表明,高质量的单元测试还可以帮助我们完善自己的代码.这篇博客将通过一些简单的测试案例,介绍几款Node.js测试模 ...

  2. elasticsearch 索引 red 状态恢复 green

    方案一 找到状态为 red 的索引 curl -X GET "http://172.xxx.xxx.174:9288/_cat/indices?v=" red open index ...

  3. node.js平台下Express的session与cookie模块包的配置

    首先下载两个模块包 session模块包:用于保持登录状态或保持会话状态等. npm install express-session --save-dev cookie模块包:用于解析cookie. ...

  4. 微服务--webapi实现,脱离iis,脱离tomcat

    前言 微服务,顾名思义就是微小的单一的服务程序,单一流程,单一发布,开发和部署都可独立: 这是我的理解: 但基于web的服务,不管是webservice还是webapi等类似的服务都需要基于iis或者 ...

  5. python 调取 shell 命令的几种方法

    os.system()无法获得到输出和返回值 os.popen()output = os.popen('cat /proc/cpuinfo')print output.read()返回的是 file ...

  6. python之列表作为函数的参数

    函数参数为 列表或者字典 传递一个列表,例如 [1, 2, 3] 将此传给函数get_sum() 求出 各个元素之和 传递一个字典,打印出key/value的对应关系表: #!/usr/bin/env ...

  7. 关于ng路由的传参问题(传递一个,多个参数)

    在ng的页面条转传参数的方法,ui-sref,$state Ui-sref:用于html页面进行单页面的跳转 $state:用于js代码中跳转 重点:明确传递方,接受方 [传递单个参数] 对于传递方: ...

  8. Letter Combinations of a Phone Number:深度优先和广度优先两种解法

    Letter Combinations of a Phone Number Given a digit string, return all possible letter combinations ...

  9. 浩哥解析MyBatis源码(六)——DataSource数据源模块之池型数据源

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也 ...

  10. VS窗体选择BackGroupImage属性报错:已添加具有相同键的项

    高墙我今天第一次遇见这个问题.既然说是"已添加具有相同键的项."那我自然地认为会不会是文件夹哪里命名了两个相同的文件名.然后在这个Exception上越走越远. 好了不说废话.出现 ...