C++ 学习笔记(一)
常用头文件
#include <iostream> // 输入输出流
#include <algorithm> // 常用算法函数
#include <vector> // 容器
#include <string> // 可变长字符序列
#include <stack> // 栈
#include <queue> // 队列
#include <map> // 键值对
#include <set> // 集合
#include <math.h> // 常用数学函数
-
常用算法的函数(方法)有:sort、equal、swab、min、max
-
vector可以当作数组使用,想制造二维数组就是 容器套容器
输入与输出
输入:cin、scanf、getchar、getline
输出:cout、printf
以下示例代码中的变量定义如下:
int i = 10;
int j = 20;
char ch = 'h';
string s;
输入
// cin
cin >> i >> j;
// scanf
scanf("%d %d", &i, &j); // 注意此处对变量的处理与 printf 的区别
// 若输入数据时,需要以逗号为间隔,则不建议使用 cin,应使用 scanf
scanf("%d, %d", &i, &j);
// 输入字符
ch = getchar();
// 输入字符串
getline(cin, s);
getline 与 getchar 细节分析:
getline、getchar 都会把 空格 和 回车 当作字符输入
不同的是:
- getchar 不会把末尾的回车吃掉,会将回车留在 输入流 中
- getline 把回车当作结束符,这个回车不会留在 输入流 中
所以,若要在使用 getchar 后紧接着使用 getline,若不对 getchar 保留在输入流中的回车进行处理,则getline会把这个回车当作输入,从而导致错误赋值,解决方法如下:
ch = getchar(); // 正常赋值
getchar(); // 处理输入流的回车
getline(cin, s);
如示例代码所示,用getchar来处理多余的回车
cin 同样会在输入流中保留回车
另外一个例子:
int i;
cin >> i;
ch = getchar(); // getchar 接收了这个回车,并赋值给了 ch
cout << ch << endl; // ch 输出回车后,紧接着 endl 也输出回车
改进:
int i;
cin >> i; // 回车留在了 输入流 中
getchar(); // 把 cin 后面多余的回车吃掉
ch = getchar(); // 又一个回车留在了 输入流 中
getchar(); // 把这个输入流中的回车 处理
scanf 同样也会在输入流中保留回车,此处省略解释
总结:
cin、getchar()、scanf() 都会把回车保留在 输入流 中
getline() 不会把回车保留在 输入流 中
所以若在输入数字或字符以后要再次输入字符串或者字符,在使用cin、getchar、scanf 时应对保留在输入流中的 回车进行处理
处理方式:getchar();
从而把输入流中的回车吃掉,也就不会影响到下一次的正常输入了
此处只是建议,具体需要看需求
输出
// 输出十进制整型0
printf("%d", i);
// 输出十六进制整型
printf("%x", i);
// 以十六进制格式显示输出
printf("%#x", i);
// 对输出数字宽度进行限制,此处的数字可以随意更改,空位默认用空格占位
printf("%4d", i);
// 不希望以空格的形式占位,以 0 补位
printf("%04d", i);
// 输出浮点数,默认输出6位小数
printf("%f", 10.0);
// 控制保留小数的位数
printf("%.1f", 10.0);
// 控制浮点数显示宽度
printf("%6f", 10.0);
// 输出字符
printf("%c", ch);
// 输出字符串
printf("%s\n", "hello world");
变量声明、定义与初始化
// 声明一个变量
extern int i;
若对其输出,编译器会报错:undefined reference to `i'
// 声明并定义一个变量
int i;
会输出0,因未对其进行初始化,会出现警告:warning: 'i' is used uninitialized in this function
int i = 10; // 正确对变量的处理
vector初体验
// 实现从1 + 2 + ... + 10
// 传统方法
int sum = 0;
for(int i = 1; i < 10; i++) {
sum += i;
}
cout << sum << endl;
// 使用容器
sum = 0;
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(auto i : v) {
sum += i;
}
cout << sum << endl;