C++好用的模块

C++好用的模块

一览

整体模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <sstream>
#include <map>
#include <vector>
#include <set>

using namespace std;

const int maxn = 10005;

int main()
{
int n;
scanf("%d", &n);
while(n--)
//while (~scanf("%d", &n) && n)
//while (~scanf("%d", &n))
{

}
return 0;
}

头文件解析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// C语言的基本头文件
#include <cstdlib>
#include <cstdio> // 输入输出
#include <cmath> // 数学
#include <cstring> // 字符
// C++算法
// 常用的有sort(a, a + n, cmp)
#include <algorithm>
// 映射
// 类似于Python中的dict
// 声明:
// map<string, int> a; string到int的映射
// 方法:
// 直接赋值a[b] = 1
// 迭代的时候对于指针maap,maap->first就是key,maap->second就是value
#include <map>
// 不定长数组
// 声明:
// vector<int> a; 一维不定长数组
// vector<int> a[maxn]; 二维不定长数组, 第一维大小固定
// 方法:
// a.size()读取大小
// a.resize()改变大小
// a.push_back()向尾部添加元素
// a.pop_back()删除最后一个元素
#include <vector>
// 集合,里面不包含重复的元素
// 声明set<int> a;
// 方法:
// a.insert() 加入集合
// a.size() 集合大小
// a.begin() 集合开始指针
#include <set>
// C++的强大的字符类
// 读入一行
// string a;
// getline(cin, a)
// 直接流式读写
// cin >> s;
#include <string>
// 把字符串变成流来让string读入
// string line;
// getline(cin, line);
// stringstream ss(a);
// ss >> a; 直接把ss的内容也就是line读入到a中了
#include <sstream>
// C++的输入输出流,cin和cout就在这里面
#include <iostream>

说明

帮助最大的应该是string类了,对于字符串的处理方便多了,直接就过了一个直接看很麻烦的题,不过可能会超时。

相关方法:

  • substr(开始的位置, 子串的长度) 返回值也是一个string类的字符串
  • length()字符串长度

另外的就是set类了,对于统计字符串的种类方便多了,对,字符串!数字还好说。

流式操作也很方便

  • 表示流入,例如cin>>a;输入流的数据流入a

  • <<表示流出,总之两个都表示流的方向,例如cout<<a;a的数据流到输出流
  • 还有stringstream可以把string变成流,对于那种一行有很多数据用空格隔开的简直不能更好用,但是时间也是一个问题

两个实例

剪花布条

一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

分析:

用string类来构造字符串,然后调用string的find方法来寻找子字符串,一直这样做下去就可以了。注意的是,为了方便匹配完后把匹配出来的结果包括子串一起删除会更加方便。

1
2
3
4
5
6
string a, b;
if (a.find(b) != -1)
{
cnt++;
a = a.substr(n + b.length(), a.length() - b.length() - n + 1);
}

单词数

lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

分析:

这里就是上面说的,不用集合会很麻烦

1
2
3
4
5
6
7
set<string> dict;

stringstream ss(s);
while(ss >> buf)
dict.insert(buf);

printf("%d\n", dict.size());