哈希表
unordered_set<int> mySet;
mySet.insert(6); //插入元素
mySet.size() 容器中元素的数量
mySet.empty() 如果是空就true
mySet.insert(10); 插入元素,如果元素已存在,则不会插入
mySet.find(20); 查找元素,如果找到,返回一个指向元素的迭代器;如果未找到,返回一个指向 end() 的迭代器。(找到这个元素的位置)
mySet.count(30) 因为 unordered_set 中元素唯一, 如果元素存在返回1 不存在返回0
mySet.erase(it); 擦除迭代器 it 指向的元素(可以和find配合,删除某个元素)
mySet.clear(); 擦除全部元素
unordered_map<int, string> map;
//输入
for (int i = 0; i < 5; ++i) {
cin >> key;
cin >> value;
map[key] = value;
}
map.insert({4, "four"}); //插入元素
string value = map[3]; //访问元素
if (map.find(2) != map.end()) { //检查键是否存在
// 键 2 存在
}
map.erase(2); // 删除键为 2 的元素
map.erase(map.begin()); // 删除迭代器指向的元素
//遍历
auto it = map.begin(); // 获取开始迭代器
for (auto it = map.begin(); it != map.end(); ++it) {
std::cout << it->first << " => " << it->second << std::endl;
}
unordered_map<int, int> map;
auto it = map.find(2);
if (it != map.end()) {
cout << it->second << endl; // 找到并访问值
}
map.erase(2); // 删除键为 2 的元素
map.erase(map.begin()); // 删除迭代器指向的元素
//传统迭代器遍历
for (auto it = map.begin(); it != map.end(); ++it) {
cout << it->first << " => " << it->second << endl;
}
//c++11以上遍历
for (const auto& pair : map) {
cout << pair.first << " => " << pair.second << endl;
}
size_t size = map.size(); //容器大小
bool isEmpty = map.empty(); //是否为空
pair数对
pair<int, int> intPair; //常规定义
cin >> myPair.first;
cin >> myPair.second;
//结合动态数组
vector<pair<int, int>> intPair;
//关于输入操作
int size;
cin >> size; //确定大小
for (int i = 0; i < size; ++i) {
int first, second;
cin >> first >> second;
intPair.push_back({first, second});
}
//关于输出
for (size_t i = 0; i < intPair.size(); ++i) {
cout << "Index " << i << ": (" << intPair[i].first << ", " << intPair[i].second << ")" << endl;
}
// 修改第一个 pair
intPair[0].first = 10;
intPair[0].second = 20;
// 排序(默认按照 pair 的第一个元素排序)
sort(intPair.begin(), intPair.end());
堆
priority_queue<int> max_heap; //默认是最大堆
max_heap.push(3); //添加
int top_element = max_heap.top(); //访问最大元素2
max_heap.pop(); //移除堆顶
//定义一个最小堆
struct Compare {
bool operator()(int lhs, int rhs) {
return lhs > rhs; // 最小堆
}
};
int main() {
priority_queue<int, vector<int>, Compare> min_heap;
min_heap.push(1);
}
栈(后进先出)
stack<int> myStack;
myStack.push(10); //添加
myStack.top(); //查看栈顶
myStack.pop(); //移除栈顶
if (!myStack.empty()) {
//还有元素 不是空的
}
队列(后进后出)
queue<int> myQueue;
myQueue.push(10); //只能往后边添加
myQueue.front() //检查队首
myQueue.pop(); //移除队首
if (!myQueue.empty()) //检查是否为空
二叉树结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
//创建树根
TreeNode *root = new TreeNode(rootVal);
cin >> root->val;
//左边
root->left = new TreeNode(leftVal);
//右边
root->right = new TreeNode(rightVal);
链表结构
struct ListNode {
int val;
ListNode *next;
explicit ListNode(int x) : val(x), next(nullptr) {}
};
int main() {
// 创建链表 1->2->3->nullptr
ListNode *head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = nullptr; // 链表结束
}
//关于遍历使用
ListNode *node = head; //一个传递方法
printList(node); //定义函数
void printList(ListNode* node) {
while (node != nullptr) {
cout << node->val << "->";
node = node->next;
}
}
动态数组
vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(4); // 在 vector 末尾添加元素
vec.push_front(0); // 在 vector 开头添加元素(需要包含 <algorithm>)
vec.pop_back(); // 删除最后一个元素
vec.erase(vec.begin() + 1); // 删除第二个元素
//遍历
for (int i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
sort(vec.begin(), vec.end());//升序排序
sort(vec.begin(), vec.end(), greater<int>()); //降序
sort(vec.begin(), vec.end(), compare); //降序的另一种方法 需要定义compare
//bool compare(int a, int b) {
// return a > b;
//}
//去重
vector<int> vec = {1, 2, 2, 3, 4, 4, 5};
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
//关于常用的vector<vector<string>>
vector<vector<string>> matrix = {
{"one", "two"},
{"three", "four"}
};
// 删除矩阵中的行
matrix.pop_back();
// 删除特定行的列元素
matrix[1].pop_back();
关于string和char的基本操作
//string
string str1 = "Hello, ";
string str2 = "World!";
string str3 = str1 + str2; // str3 现在是 "Hello, World!"
int length = str.length();
if (str1 == str2){} //比对
string toFind = "World";
int pos = str.find(toFind); // 查找子字符串 "World" 的位置
str.insert(7, ", there"); // 在位置 7 插入 ", there"
str.erase(5, 5); // 删除从位置 5 开始的 5 个字符
str.replace(6, 5, "there"); // 将 "World" 替换为 "there"
//char
string str = "A";
char ch = str[0]; // ch 现在是 'A'
大小写转化
char ch = 'A';
ch = toupper(ch); //小写变大写
ch = tolower(ch); //大写变小写
cout << ch << endl; // 输出: a
//对于string类型
string str = "Hello, World!";
// 转换为小写
transform(str.begin(), str.end(), str.begin(),
[](unsigned char c) -> unsigned char { return std::tolower(c); });
cout << "Lowercase: " << str << endl;
关于强制类型转化
//c++11及以上 int到string
int main() {
int num = 123;
string str = to_string(num);
cout << str << endl; // 输出: 123
return 0;
}
//int->char
int num = 65; // ASCII for 'A'
char ch = static_cast<char>(num);
//char->int
char ch = 'A';
int num = static_cast<int>(ch);
输出
double pi = 3.141592653589793;
printf("%.2f\n", pi); // 输出: 3.14
数学计算
//基本
abs(x):计算整数 x 的绝对值。
fabs(x):计算浮点数 x 的绝对值。
floor(x):计算不大于 x 的最大整数。
ceil(x):计算不小于 x 的最小整数。
sqrt(x):计算 x 的平方根。
pow(x, y):计算 x 的 y 次幂。
exp(x):计算 e 的 x 次幂(自然指数函数)。
log(x):计算 x 的自然对数。
log10(x):计算 x 的以 10 为底的对数。
//三角函数
sin(x):计算 x 的正弦值(x 以弧度为单位)。
cos(x):计算 x 的余弦值(x 以弧度为单位)。
tan(x):计算 x 的正切值(x 以弧度为单位)。
asin(x):计算 x 的反正弦值(结果以弧度为单位)。
acos(x):计算 x 的反余弦值(结果以弧度为单位)。
atan(x):计算 x 的反正切值(结果以弧度为单位)。
atan2(y, x):计算两点 (x, y) 与原点之间的角度(结果以弧度为单位)。
//双曲函数
sinh(x):计算 x 的双曲正弦值。
cosh(x):计算 x 的双曲余弦值。
tanh(x):计算 x 的双曲正切值。
//关于圆计算
#ifndef M_PI
#define M_PI 3.14159265358979323846
弧度=角度×(M_PI/180°)
//角度转化为弧度
double degrees = 90.0;
double radians = degrees * M_PI / 180.0;
//然后就可以计算三角函数
eg:sin(radians);