typedef v.s. #define

本文详细对比了C/C++中typedef与#define的使用方法及其区别,介绍了它们各自的适用场景,并通过示例说明了如何正确选择使用typedef或#define。

一、typedef的用法

在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:

typedef    int       INT;
typedef    int       ARRAY[10];
typedef   (int*)   pINT;

typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。

二、#define的用法

#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编

译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:

#define   INT             int
#define   TRUE         1
#define   Add(a,b)     ((a)+(b));
#define   Loop_10    for (int i=0; i<10; i++)

在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。

三、typedef与#define的区别

从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量

,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define

INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的

编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗

长的类型的别名。

宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变

量的功能。请看上面第一大点代码的第三行:

typedef    (int*)      pINT;
以及下面这行:
#define    pINT2    int*

效果相同?实则不同!实践中见差别:pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;

表示定义了一个整型指针变量a和整型变量b。

注意:两者还有一个行尾;号的区别哦!

测试点信息 Subtask #1 4ms/836.00KB WA #1 Wrong Answer. 4ms/812.00KB WA #2 Wrong Answer. Subtask #2 471ms/12.29MB AC #3 Accepted, 得分 10. Subtask #3 716ms/12.52MB WA #4 Wrong Answer. Subtask #4 825ms/14.80MB WA #5 Wrong Answer. Subtask #5 655ms/13.52MB WA #6 Wrong Answer. Subtask #6 8ms/788.00KB WA #7 Wrong Answer. 8ms/840.00KB WA #8 Wrong Answer. 8ms/788.00KB WA #9 Wrong Answer. 8ms/788.00KB WA #10 Wrong Answer. 8ms/812.00KB WA #11 Wrong Answer. 8ms/816.00KB WA #12 Wrong Answer. 9ms/808.00KB WA #13 Wrong Answer. 24ms/788.00KB WA #14 Wrong Answer. 38ms/788.00KB WA #15 Wrong Answer. 12ms/816.00KB WA #16 Wrong Answer. Subtask #7 27ms/840.00KB WA #17 Wrong Answer. 23ms/848.00KB WA #18 Wrong Answer. 26ms/916.00KB WA #19 Wrong Answer. 28ms/852.00KB WA #20 Wrong Answer. 25ms/824.00KB WA #21 Wrong Answer. 28ms/876.00KB WA #22 Wrong Answer. 60ms/880.00KB WA #23 Wrong Answer. 162ms/1.11MB WA #24 Wrong Answer. 160ms/1.12MB WA #25 Wrong Answer. 47ms/784.00KB WA #26 Wrong Answer. Subtask #8 657ms/13.28MB WA #27 Wrong Answer. 1.20s/17.43MB TLE #28 Time Limit Exceeded. 926ms/11.82MB WA #29 Wrong Answer. 1.20s/16.07MB TLE #30 Time Limit Exceeded.#include <bits/stdc++.h> using namespace std; const bool cosmon = true; typedef long long ll; typedef pair<int, int> pii; typedef vector<vector<pii>> Graph; int n, m; ll k; Graph g; vector<double> d1, d2, d3, d4; void dij(int s, vector<double>& d) { priority_queue<pair<double, int>, vector<pair<double, int>>, greater<>> q; fill(d.begin(), d.end(), 1e18); d[s] = 0; q.push({0, s}); while (!q.empty()) { auto [t, u] = q.top(); q.pop(); if (t > d[u]) continue; for (auto [v, w] : g[u]) { double nt = t + 1.0 / w; if (nt < d[v]) { d[v] = nt; q.push({nt, v}); } } } } int main() { int T; cin >> T; while (T--) { cin >> n >> m >> k; g.assign(n + 1, {}); for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; g[u].push_back({v, 1}); g[v].push_back({u, 1}); } int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; d1.assign(n + 1, 0); d2 = d1; d3 = d1; d4 = d1; dij(x1, d1); dij(y1, d2); dij(x2, d3); dij(y2, d4); if (d1[y1] > 1e9 || d3[y2] > 1e9) { cout << "-1\n"; continue; } double ans = d1[y1] + d3[y2]; for (int u = 1; u <= n; ++u) { for (auto [v, w] : g[u]) { if (u >= v) continue; double a1 = d1[u] + d2[v] + 0.5; double a2 = d1[v] + d2[u] + 0.5; double b1 = d3[u] + d4[v] + 0.5; double b2 = d3[v] + d4[u] + 0.5; double ta = min(a1, a2), tb = min(b1, b2); if (ta + tb < ans && k >= 1) ans = ta + tb; if (ta + tb - 1.0 < ans && k >= 2) ans = ta + tb - 1.0; } } cout.precision(12); cout << fixed << ans << '\n'; } return 0; }
最新发布
10-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值