浅谈C++数据结构

前言

对于C++党来说,最烦的就是 int 和 long long 的区别了吧。C++繁多的数据量,让我们防不胜防。(十年OI一场空,不开longlong见祖宗)。所以本文浅谈一下各类数据结构的特点,以及如何判断使用哪种数据结构。

各数据结构特点

  - 整数型

(short由于及其不常用不计入)

数据名字数据中文名起始值结束值
int整型-2^{31} = -21474836482^{31} - 1 = 2147483647
unsigned int无符号整型02^{32} - 1=4294967295
long long长整数型-2 ^ {63}2 ^ {63} - 1
unsigned long long无符号长整数型02 ^ {64} - 1

 - 小数型

数据名称数据精度(小数点位)
float8 位
double16 位

如何使用?

 - 整型

事实上,整数的使用是最为困难的。如果我们选择使用int,万一出现5 \times 10 ^ 9这种毒瘤数据,那就相当于放弃了到手的AC;但如果选择long long,就会出现很难调节的问题(容易出现MLE),所以,我选取了三个非常经典的事例,分析这三种情况。

1. int 类

int是使用最多的数据类型。不妨看到洛谷的P1001。里面有这么一句话:

我们知道,int最大可存约 2.1 \times 10 ^ {9} 的大小,而本题中 a 与 b 相加得到的最多是 2 \times 10 ^ 9 ,int类型就完全足够使用了。即可写出代码。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    cin >> a >> b;
    int s;
    s = a + b;
    cout << s << endl;
    return 0;
}

结论:当单个数据的大小小于等于 2 \times 10 ^ 9 ,且没有大数据的乘、加,经过粗略计算不会超过int范畴的时候,应当使用int类型。

2. long long 类

重点讲一下用long long的时候。

看到例题:P10567,里面有这么一句话:

看到了吗?保证 1 \le n \le 10 ^ {18} ,这意味着 int 类型是完全无法存下的,需要更大的类型(longlong)来存下这个 n。所以本题使用longlong类型,可写出代码如下。

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long n;
    cin >> n;
    if (n % 2 == 1){
        puts("No");
    }
    else {
        puts("Yes");
    }
    return 0;
}

再来看到这个例题:P5534,乍眼一看,10 ^ 6 的大小,int就够用了吧?

其实不够。虽然表面上看可以,但如果公差 d 就是 10 ^ 6 ,n 又取最大(10 ^ 6)呢?简单算算,发现结果是 5 \times 10 ^ {13},int 是完全存不下的,要用longlong,故写出代码。

#include <bits/stdc++.h>
#define int long long
using namespace std;
int s[1000005] = {};
signed main(){
    cin >> s[1] >> s[2];
    int d = s[2] - s[1];
    int n;cin >> n;
    int cnt = s[1] + s[2];
    for (int i=3;i<=n;i++){
        s[i] = s[i-1] + d;
        cnt += s[i];
    }
    cout << cnt;
    return 0;
}

注:上代码中提到的#define int long long,代表所有int实际上均为longlong类型,是简化代码的好方法,但如果写了这一行,main的定义就请写signed main,否则CE。

结论:当单个数据大小较大,超过了int所能承受的范围;或单个数据虽然较小,但因大数的乘法造成数据大小指数级增长,粗略估算会超过int承受范围的,应当使用longlong数据类型。

 - 浮点型(小数型)

浮点型没有什么要强调的点,如果题目要求使用单精度,请用 float 类型;但如果要求双精度或无特别要求的情况下,统一使用精度较高的 double。

结语

C++ 的数据结构使用是一门学问,只有在刷题中不断找到适合题目的使用方法,才有可能不被数据结构“坑”到,找回那本属于你的分数!

---             END             ---

---            全文完            ---

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值