bits/stdc++.h
是一个非标准但广泛使用的C++头文件,它包含了C++标准库中的所有头文件。这意味着包含这个头文件后,你可以直接使用C++标准库提供的几乎所有功能,无需单独包含其他头文件。
注意:这个头文件并非C++标准的一部分,主要在GCC编译器中可用。在生产环境或需要严格遵循标准的项目中,不建议使用。但在算法竞赛、学习和快速原型开发中非常方便。
用于从标准输入设备(通常是键盘)读取数据和向标准输出设备(通常是屏幕)输出数据。
#include <bits/stdc++.h> using namespace std; int main() { int num; // 声明一个整数变量 string name; // 声明一个字符串变量 // 输出提示信息 cout << "请输入一个整数: "; // 读取整数 cin >> num; // 输出提示信息 cout << "请输入你的名字: "; // 读取字符串(遇到空格会停止) cin >> name; // 输出结果 cout << endl; // 换行 cout << "你输入的整数是: " << num << endl; cout << "你输入的名字是: " << name << endl; return 0; }
cout
用于输出数据,配合 <<
运算符使用cin
用于输入数据,配合 >>
运算符使用endl
用于换行并刷新输出缓冲区cin
会在遇到空格、制表符或换行符时停止读取用于读取一整行字符串,包括空格在内的所有字符,直到遇到换行符为止。
#include <bits/stdc++.h> using namespace std; int main() { string line; cout << "请输入一句话(可以包含空格): "; // 读取一整行输入,包括空格 getline(cin, line); cout << "你输入的是: " << line << endl; cout << "这句话的长度是: " << line.length() << "个字符" << endl; return 0; }
getline(cin, str)
函数需要两个参数:输入流和存储结果的字符串变量cin >> variable
之后立即使用 getline()
,需要先处理残留的换行符用于控制输出的格式,如设置整数的进制、浮点数的精度等。
#include <bits/stdc++.h> using namespace std; int main() { int num = 255; double pi = 3.1415926535; // 十进制输出(默认) cout << "十进制: " << num << endl; // 十六进制输出 cout << "十六进制: " << hex << num << endl; // 八进制输出 cout << "八进制: " << oct << num << endl; // 恢复十进制输出 cout << "恢复十进制: " << dec << num << endl; // 浮点数默认输出 cout << "\n默认浮点数: " << pi << endl; // 设置浮点数精度为2位小数 cout << "保留2位小数: " << fixed << setprecision(2) << pi << endl; // 设置浮点数精度为6位小数 cout << "保留6位小数: " << setprecision(6) << pi << endl; return 0; }
hex
- 以十六进制格式输出整数oct
- 以八进制格式输出整数dec
- 以十进制格式输出整数(默认)fixed
- 以固定小数位数格式输出浮点数setprecision(n)
- 设置浮点数的精度为n位setw(n)
- 设置字段宽度为n个字符string类提供了多种方法来操作字符串,如获取长度、拼接、比较等。
#include <bits/stdc++.h> using namespace std; int main() { // 初始化字符串的几种方式 string s1 = "Hello"; string s2("World"); string s3; // 空字符串 // 字符串拼接 s3 = s1 + " " + s2; // 使用+运算符 cout << "拼接结果: " << s3 << endl; // 获取字符串长度 cout << "字符串长度: " << s3.length() << endl; // 字符串比较 if (s1 == "Hello") { cout << "s1 等于 'Hello'" << endl; } // 字符串是否为空 string emptyStr; if (emptyStr.empty()) { cout << "emptyStr 是一个空字符串" << endl; } // 字符串赋值 string s4; s4 = s1; cout << "s4 的值: " << s4 << endl; return 0; }
length()
/ size()
- 返回字符串的长度empty()
- 判断字符串是否为空,为空返回trueoperator+
- 拼接两个字符串operator=
- 字符串赋值operator==
/ operator!=
- 字符串比较访问字符串中的单个字符,以及提取子字符串。
#include <bits/stdc++.h> using namespace std; int main() { string s = "Hello, World!"; // 使用[]访问单个字符(索引从0开始) cout << "第一个字符: " << s[0] << endl; cout << "第六个字符: " << s[5] << endl; // 使用at()方法访问单个字符(会做边界检查) try { cout << "第十个字符: " << s.at(9) << endl; // 尝试访问超出范围的字符 cout << "第20个字符: " << s.at(19) << endl; } catch (out_of_range& e) { cout << "访问出错: " << e.what() << endl; } // 提取子字符串 substr(pos, len) // 从位置6开始,提取5个字符 string sub1 = s.substr(7, 5); cout << "子字符串1: " << sub1 << endl; // 输出 "World" // 只指定起始位置,提取到字符串末尾 string sub2 = s.substr(0, 5); cout << "子字符串2: " << sub2 << endl; // 输出 "Hello" return 0; }
operator[]
- 通过索引访问字符,不做边界检查at(index)
- 通过索引访问字符,会做边界检查,超出范围会抛出异常substr(pos, len)
- 从位置pos开始,提取长度为len的子字符串在字符串中查找子串,以及替换字符串中的部分内容。
#include <bits/stdc++.h> using namespace std; int main() { string s = "I like C++, C++ is fun!"; // 查找子串 size_t pos = s.find("C++"); if (pos != string::npos) { cout << "找到 'C++',位置在: " << pos << endl; } // 从指定位置开始查找 pos = s.find("C++", 10); // 从索引10开始查找 if (pos != string::npos) { cout << "再次找到 'C++',位置在: " << pos << endl; } // 替换子串 string s2 = s; // 从位置7开始,替换3个字符为"Python" s2.replace(7, 3, "Python"); cout << "替换后: " << s2 << endl; // 查找并替换所有匹配项 string s3 = s; pos = 0; while ((pos = s3.find("C++", pos)) != string::npos) { s3.replace(pos, 3, "Java"); pos += 4; // 移动到替换后的下一个位置,避免重复替换 } cout << "全部替换后: " << s3 << endl; return 0; }
find(substr, pos)
- 从位置pos开始查找substr,返回首次出现的位置string::npos
- 一个特殊值,表示未找到匹配项replace(pos, len, newstr)
- 从位置pos开始,替换长度为len的字符为newstrvector是最常用的容器,提供动态大小的数组功能,支持快速随机访问。
#include <bits/stdc++.h> using namespace std; int main() { // 初始化vector的几种方式 vectorv1; // 空vector vectorv2(5); // 包含5个元素,初始值为0 vectorv3(3, 10); // 包含3个元素,每个元素值为10 // 对于GCC 4.9.2,使用C++11列表初始化需要开启-std=c++11 vectorv4; // 向vector添加元素 v4.push_back(1); v4.push_back(2); v4.push_back(3); // 访问vector元素 cout << "v3的元素: "; for (int i = 0; i < v3.size(); i++) { cout << v3[i] << " "; } cout << endl; // 使用迭代器遍历vector cout << "v4的元素: "; for (vector::iterator it = v4.begin(); it != v4.end(); ++it) { cout << *it << " "; } cout << endl; // 获取vector大小 cout << "v4的大小: " << v4.size() << endl; // 移除最后一个元素 v4.pop_back(); cout << "v4移除最后一个元素后: "; for (int num : v4) { // 范围for循环(C++11) cout << num << " "; } cout << endl; // 清空vector v4.clear(); if (v4.empty()) { cout << "v4已清空" << endl; } return 0; }
push_back(value)
- 在vector末尾添加元素pop_back()
- 移除vector末尾的元素size()
- 返回vector中元素的数量empty()
- 判断vector是否为空clear()
- 清空vector中的所有元素operator[]
- 通过索引访问元素begin()
/ end()
- 返回迭代器,用于遍历元素map是一种关联容器,存储键值对(key-value),按键自动排序,每个键唯一。
#include <bits/stdc++.h> using namespace std; int main() { // 创建一个map,键为string类型,值为int类型 mapstudentScores; // 插入键值对 studentScores["张三"] = 90; studentScores["李四"] = 85; studentScores["王五"] = 95; // 使用insert方法插入 studentScores.insert(pair("赵六", 88)); // 访问元素 cout << "张三的分数: " << studentScores["张三"] << endl; // 查找元素 string name = "李四"; map::iterator it = studentScores.find(name); if (it != studentScores.end()) { cout << name << "的分数: " << it->second << endl; } else { cout << "没有找到" << name << endl; } // 遍历map cout << "\n所有学生的分数:" << endl; for (it = studentScores.begin(); it != studentScores.end(); ++it) { // it->first 是键,it->second 是值 cout << it->first << ": " << it->second << endl; } // 获取map大小 cout << "\n学生人数: " << studentScores.size() << endl; // 删除元素 studentScores.erase("王五"); cout << "删除王五后,学生人数: " << studentScores.size() << endl; return 0; }
operator[key]
- 通过键访问或设置值insert(pair)
- 插入键值对find(key)
- 查找键,返回迭代器erase(key)
- 删除指定键的元素size()
- 返回键值对的数量begin()
/ end()
- 返回迭代器,用于遍历stack是后进先出(LIFO)的容器,queue是先进先出(FIFO)的容器。
#include <bits/stdc++.h> using namespace std; int main() { // 演示stack(栈)的使用 stacks; // 入栈 s.push(10); s.push(20); s.push(30); cout << "栈的大小: " << s.size() << endl; cout << "栈顶元素: " << s.top() << endl; // 出栈 cout << "出栈顺序: "; while (!s.empty()) { cout << s.top() << " "; // 获取栈顶元素 s.pop(); // 移除栈顶元素 } cout << endl << endl; // 演示queue(队列)的使用 queueq; // 入队 q.push("第一个"); q.push("第二个"); q.push("第三个"); cout << "队列的大小: " << q.size() << endl; cout << "队首元素: " << q.front() << endl; // 出队 cout << "出队顺序: "; while (!q.empty()) { cout << q.front() << " "; // 获取队首元素 q.pop(); // 移除队首元素 } cout << endl; return 0; }
push(value)
- 向栈顶添加元素pop()
- 移除栈顶元素top()
- 返回栈顶元素size()
- 返回栈中元素数量empty()
- 判断栈是否为空push(value)
- 向队尾添加元素pop()
- 移除队首元素front()
- 返回队首元素back()
- 返回队尾元素size()
- 返回队列中元素数量empty()
- 判断队列是否为空对容器中的元素进行排序,默认按升序排列,也可以自定义排序规则。
#include <bits/stdc++.h> using namespace std; // 自定义比较函数,用于降序排序 bool compareDesc(int a, int b) { return a > b; // a > b 时返回true,即a排在b前面 } // 自定义结构体 struct Student { string name; int score; }; // 结构体比较函数,按分数升序排列 bool compareStudentByScore(const Student& s1, const Student& s2) { return s1.score < s2.score; } int main() { // 1. 排序整数数组 vectornumbers; numbers.push_back(5); numbers.push_back(2); numbers.push_back(8); numbers.push_back(1); numbers.push_back(9); // 默认升序排序 sort(numbers.begin(), numbers.end()); cout << "升序排序结果: "; for (int num : numbers) { cout << num << " "; } cout << endl; // 使用自定义函数进行降序排序 sort(numbers.begin(), numbers.end(), compareDesc); cout << "降序排序结果: "; for (int num : numbers) { cout << num << " "; } cout << endl << endl; // 2. 排序结构体 vectorstudents; students.push_back({"张三", 85}); students.push_back({"李四", 92}); students.push_back({"王五", 78}); // 按分数排序 sort(students.begin(), students.end(), compareStudentByScore); cout << "按分数排序的学生列表:" << endl; for (const Student& s : students) { cout << s.name << " - " << s.score << "分" << endl; } return 0; }
sort(begin, end)
- 对[begin, end)范围内的元素进行升序排序sort(begin, end, comp)
- 使用比较函数comp进行排序min()返回两个值中的较小者,max()返回两个值中的较大者,swap()交换两个值。
#include <bits/stdc++.h> using namespace std; int main() { // 基本数据类型的min和max int a = 10, b = 20; cout << "a = " << a << ", b = " << b << endl; cout << "min(a, b) = " << min(a, b) << endl; cout << "max(a, b) = " << max(a, b) << endl; // 字符串的min和max(按字典序比较) string s1 = "apple", s2 = "banana"; cout << "\ns1 = " << s1 << ", s2 = " << s2 << endl; cout << "min(s1, s2) = " << min(s1, s2) << endl; cout << "max(s1, s2) = " << max(s1, s2) << endl; // swap交换两个变量的值 cout << "\n交换前: a = " << a << ", b = " << b << endl; swap(a, b); cout << "交换后: a = " << a << ", b = " << b << endl; // 交换数组元素 vectorv; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); cout << "\n交换前的vector: "; for (int num : v) { cout << num << " "; } // 交换第2个和第4个元素(索引1和3) swap(v[1], v[3]); cout << "\n交换后的vector: "; for (int num : v) { cout << num << " "; } cout << endl; return 0; }
min(a, b)
- 返回a和b中的较小值max(a, b)
- 返回a和b中的较大值swap(a, b)
- 交换a和b的值find()用于在容器中查找指定元素,reverse()用于反转容器中元素的顺序。
#include <bits/stdc++.h> using namespace std; int main() { // 创建并初始化vector vectornumbers; numbers.push_back(3); numbers.push_back(1); numbers.push_back(4); numbers.push_back(1); numbers.push_back(5); numbers.push_back(9); cout << "原始vector: "; for (int num : numbers) { cout << num << " "; } cout << endl; // 使用find查找元素 int target = 4; vector::iterator it = find(numbers.begin(), numbers.end(), target); if (it != numbers.end()) { // 计算找到的位置(索引) int index = it - numbers.begin(); cout << "找到元素 " << target << ",位置在索引 " << index << endl; } else { cout << "未找到元素 " << target << endl; } // 查找不存在的元素 target = 7; it = find(numbers.begin(), numbers.end(), target); if (it == numbers.end()) { cout << "未找到元素 " << target << endl; } // 使用reverse反转元素顺序 reverse(numbers.begin(), numbers.end()); cout << "反转后的vector: "; for (int num : numbers) { cout << num << " "; } cout << endl; // 反转字符串 string s = "Hello World"; cout << "\n原始字符串: " << s << endl; reverse(s.begin(), s.end()); cout << "反转后的字符串: " << s << endl; return 0; }
find(begin, end, value)
- 在[begin, end)范围内查找valuereverse(begin, end)
- 反转[begin, end)范围内的元素顺序包括绝对值、平方根、幂运算等常用数学函数。
#include <bits/stdc++.h> using namespace std; int main() { // 绝对值函数 int num1 = -10; double num2 = -3.14; cout << "abs(" << num1 << ") = " << abs(num1) << endl; cout << "abs(" << num2 << ") = " << abs(num2) << endl; // 平方根函数 double x = 25.0; cout << "\nsqrt(" << x << ") = " << sqrt(x) << endl; // 幂运算函数 double base = 2.0; double exponent = 3.0; cout << base << "^" << exponent << " = " << pow(base, exponent) << endl; // 指数函数(e的幂) double exp_arg = 1.0; cout << "exp(" << exp_arg << ") = " << exp(exp_arg) << endl; // 对数函数 double log_arg = exp(1.0); // e的值 cout << "log(" << log_arg << ") = " << log(log_arg) << endl; // 自然对数 cout << "log10(100) = " << log10(100) << endl; // 以10为底的对数 return 0; }
abs(x)
- 返回x的绝对值,适用于整数和浮点数sqrt(x)
- 返回x的平方根,x必须是非负数pow(base, exp)
- 返回base的exp次幂exp(x)
- 返回e的x次幂,其中e是自然对数的底数log(x)
- 返回x的自然对数(以e为底)log10(x)
- 返回x的以10为底的对数包括正弦、余弦等三角函数,以及向上取整、向下取整等取整函数。
#include <bits/stdc++.h> using namespace std; int main() { // 三角函数(参数为弧度) double pi = acos(-1.0); // 获取π的值 cout << "π ≈ " << pi << endl; double angle = pi / 2; // 90度,以弧度表示 cout << "sin(π/2) = " << sin(angle) << endl; cout << "cos(π/2) = " << cos(angle) << endl; cout << "tan(π/4) = " << tan(pi / 4) << endl; // 反三角函数 double sin_val = 1.0; cout << "asin(" << sin_val << ") = " << asin(sin_val) << " 弧度" << endl; // 取整函数 double num = 3.7; cout << "\n" << num << " 的向上取整: " << ceil(num) << endl; cout << num << " 的向下取整: " << floor(num) << endl; num = 3.2; cout << num << " 的向上取整: " << ceil(num) << endl; cout << num << " 的向下取整: " << floor(num) << endl; // 四舍五入 cout << "\n3.4 四舍五入: " << round(3.4) << endl; cout << "3.5 四舍五入: " << round(3.5) << endl; return 0; }
sin(x)
- 返回x的正弦值,x为弧度cos(x)
- 返回x的余弦值,x为弧度tan(x)
- 返回x的正切值,x为弧度asin(x)
- 返回x的反正弦值,结果为弧度acos(x)
- 返回x的反余弦值,结果为弧度ceil(x)
- 向上取整,返回不小于x的最小整数floor(x)
- 向下取整,返回不大于x的最大整数round(x)
- 四舍五入到最接近的整数