C++ 基础知识与常用库函数

一、输入输出

1.1 cin 与 cout

cincout 是 C++ 标准库提供的输入输出流对象。

cin 读取字符串:遇到空格或回车停止,只读取一个单词。

1
2
string s;
cin >> s;  // 输入 "hello world",s = "hello"

读取整行字符串:使用 getline(cin, s)

1
2
string s;
getline(cin, s);  // 输入 "hello world",s = "hello world"

混合输入cin >> n 后使用 getline 需要清除缓冲区。

1
2
3
4
5
int n;
cin >> n;
cin.ignore();    // 清除换行符
string s;
getline(cin, s);

1.2 输出精度控制

使用 <iomanip> 库的 fixedsetprecision 控制浮点数输出精度。

1
2
3
#include <iomanip>
double res = 3.1415926;
cout << fixed << setprecision(2) << res << endl;  // 3.14(四舍五入)

二、常见基础知识

2.1 ASCII 码

字符 ASCII 值
‘0’ 48
‘A’ 65
‘a’ 97

大小写转换:大小写字母 ASCII 值相差 32。

1
2
3
4
5
char upper = 'A';
char lower = upper + 32;  // 'a'

char lower2 = 'z';
char upper2 = lower2 - 32;  // 'Z'

判断与转换函数

1
2
3
4
islower('a');   // true,判断是否小写
isupper('A');   // true,判断是否大写
tolower('A');   // 'a',转小写
toupper('a');   // 'A',转大写

2.2 类型转换

字符串转数字

1
2
3
4
string s = "12345";
int i = stoi(s);           // 12345
long long ll = stoll(s);   // 12345
double d = stod("3.14");   // 3.14

数字转字符串

1
2
3
4
int n = 123;
string s = to_string(n);     // "123"
double d = 3.14;
string s2 = to_string(d);    // "3.140000"

2.3 进制转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 十进制转其他进制
int n = 255;
cout << oct << n << endl;   // 377(八进制)
cout << dec << n << endl;   // 255(十进制)
cout << hex << n << endl;   // ff(十六进制)

// 其他进制转十进制
string bin = "1111";
int val = stoi(bin, nullptr, 2);   // 15(二进制转十进制)
string hex_str = "ff";
int val2 = stoi(hex_str, nullptr, 16);  // 255(十六进制转十进制)

2.4 位运算

运算符 含义 示例
& 按位与 a & b
| 按位或 a | b
^ 按位异或 a ^ b
~ 按位取反 ~a
<< 左移 a << n
>> 右移 a >> n

常用技巧

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 判断奇偶
bool is_odd = n & 1;

// 交换两数
a ^= b; b ^= a; a ^= b;

// 取最低位 1
int lowbit = n & (-n);

// 判断是否是 2 的幂
bool is_power = n > 0 && (n & (n - 1)) == 0;

三、常用库函数

3.1 二分查找

lower_boundupper_bound 用于有序序列的二分查找,返回迭代器,区间为左闭右开 [lower, upper)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
vector<int> v = {1, 2, 2, 2, 3, 4, 5};

// lower_bound: 第一个 >= target 的位置
auto lb = lower_bound(v.begin(), v.end(), 2);  // 指向第1个2

// upper_bound: 第一个 > target 的位置
auto ub = upper_bound(v.begin(), v.end(), 2);  // 指向3

// 计算 target 出现的次数
int cnt = ub - lb;  // 3

3.2 排序 sort

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sort(v.begin(), v.end());                      // 升序
sort(v.begin(), v.end(), greater<int>());      // 降序

// 自定义比较函数
bool cmp(int a, int b) { return a > b; }
sort(v.begin(), v.end(), cmp);

// Lambda 表达式
sort(v.begin(), v.end(), [](int a, int b) {
    return a > b;
});

3.3 数组初始化 memset

memset 按字节填充,只能用于初始化 0 或 -1

1
2
3
int arr[100];
memset(arr, 0, sizeof(arr));   // 初始化为 0
memset(arr, -1, sizeof(arr));  // 初始化为 -1

3.4 交换 swap

1
2
3
4
5
int a = 1, b = 2;
swap(a, b);  // a = 2, b = 1

vector<int> v1 = {1, 2}, v2 = {3, 4};
swap(v1, v2);  // 交换容器内容

3.5 反转 reverse

反转指定区间 [first, last)

1
2
3
4
5
vector<int> v = {1, 2, 3, 4, 5};
reverse(v.begin(), v.end());  // {5, 4, 3, 2, 1}

string s = "hello";
reverse(s.begin(), s.end());  // "olleh"

3.6 删除元素 erase

1
2
3
4
5
6
7
vector<int> v = {1, 2, 3, 4, 5};

// 删除单个元素
v.erase(v.begin() + 2);  // 删除第3个元素,{1, 2, 4, 5}

// 删除区间
v.erase(v.begin(), v.begin() + 2);  // 删除前两个,{4, 5}

3.7 去重 unique

unique 将相邻重复元素移到末尾,返回去重后的末尾迭代器。需要先排序

1
2
3
4
vector<int> v = {1, 2, 2, 3, 3, 3, 4};
sort(v.begin(), v.end());
auto last = unique(v.begin(), v.end());
v.erase(last, v.end());  // {1, 2, 3, 4}

3.8 全排列 next_permutation

生成下一个字典序排列,返回 bool 表示是否成功。

1
2
3
4
5
6
vector<int> v = {1, 2, 3};
do {
    for (int x : v) cout << x << " ";
    cout << endl;
} while (next_permutation(v.begin(), v.end()));
// 输出所有 6 种排列

prev_permutation 生成上一个排列。

3.9 最值 min / max

1
2
3
4
5
6
int a = min(3, 5);      // 3
int b = max(3, 5);      // 5

// 初始化列表(C++11)
int c = min({1, 2, 3, 4, 5});  // 1
int d = max({1, 2, 3, 4, 5});  // 5

3.10 最值迭代器 min_element / max_element

返回区间 [first, last) 中最小/最大元素的迭代器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};

auto min_it = min_element(v.begin(), v.end());
auto max_it = max_element(v.begin(), v.end());

cout << *min_it << endl;  // 1
cout << *max_it << endl;  // 9

// 获取索引
int min_idx = min_it - v.begin();  // 1
int max_idx = max_it - v.begin();  // 5

3.11 第 n 小元素 nth_element

将第 n 小的元素放到正确位置,左边都比它小,右边都比它大。

1
2
3
4
vector<int> v = {5, 3, 1, 4, 2};
nth_element(v.begin(), v.begin() + 2, v.end());
// v[2] = 3(第3小的元素)
// v[0..1] <= 3, v[3..4] >= 3

四、常用技巧速查

需求 方法
读取整行 getline(cin, s)
数字+字符串混合输入 cin >> n; cin.ignore(); getline(cin, s);
保留小数 cout << fixed << setprecision(2) << x;
字符串转数字 stoi(), stoll(), stod()
数字转字符串 to_string()
二分查找边界 lower_bound(), upper_bound()
排序 sort()
数组初始化 memset(arr, 0, sizeof(arr))
反转 reverse()
去重 sort() + unique() + erase()
全排列 next_permutation()
最值 min(), max(), min_element(), max_element()

总结

本文总结了蓝桥杯竞赛中常用的 C++ 基础知识和库函数。掌握这些内容能够显著提高编码效率和正确率。建议在刷题中反复练习,形成肌肉记忆。