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) - 四舍五入到最接近的整数