- lizexuan's blog
STL类模板容器 & 我常用的函数
- 2023-6-12 18:42:31 @
注释中文的为已掌握函数...
#include <bits/stdc++.h>
using namespace std;
const int Test = 100, x = 1;
const char ch = 'A';
char TEst[2] = {'a', 'b'};
char TESt[2] = {'A', 'B'};
char TEST[999];
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arra[10];
inline int gcd(int x, int y) {
if (y == 0) {
return x;
}
return gcd(y, x % y);
}
inline int lcm(int x, int y) {
return x * y / gcd(x, y);
}
inline bool emm(int a) {
return a < 10;
}
int main() {
string s, www; // 字符串
wstring ws; // 宽字符串
stringstream ser; // 字符串上的流类
pair<string, string> pa; // 对组
vector<int> v; // 向量
bitset<Test> b; // 位集合
array<int, Test> a; // 定长数组
queue<int> q; // 队列
priority_queue<int> pq; // 优先队列
deque<int> d; // 双端队列
stack<int> st; // 栈
set<int> se; // 集合
multiset<int> ms; // 多重集合
unordered_set<int> us; // 无序集合
unordered_multiset<int> ums; // 无序多重集合
map<int, int> m; // 映射
multimap<int, int> mm; // 多重映射
unordered_map<int, int> um; // 无序映射
unordered_multimap<int, int> umm; // 无序多重映射
list<int> l; // 双向链表
forward_list<int> fl; // 单向链表
sqrt(x); // 平方根
cbrt(x); // 立方根
pow(x, Test); // 次方
log(x); // 求以e为底a的对数
log2(x); // 求以2为底a的对数
log10(x); // 求以10为底a的对数
hypot(x, Test); // = sqrt(x * x + Test * Test);
abs(x); // 整数求绝对值
fabs(x); // 浮点数求绝对值
fmod(x, Test); // 浮点数取模(余)
ceil(x); // 向上取整
floor(x); // 向下取整
round(x); // 四舍五入
sin(x); // 返回弧度角x的正弦
asin(x); // 返回弧度角x的反正弦
tan(x); // 返回以弧度为单位给出的角度(参数)的切线。
atan(x); // 返回以弧度为单位的数字(参数)的反正切。
cos(x); // 返回以弧度为单位给出的角度(参数)的余弦。
acos(x); // 返回以弧度为单位的数字(参数)的反余弦值。
sizeof(x); // 获取字节数
srand((unsigned)time(nullptr)); // 随机数种子
rand(); // 整型随机数
INT_MAX; // 整型最大值
RAND_MAX; // 随机数最大值
clock(); // 运行时间
time(0); // 获取时间标准值
v.begin(); // 返回头指针
v.cbegin(); // 返回const类型的头指针
v.rbegin(); // 返回逆序头指针
v.crbegin(); // 返回const类型的逆序头指针
v.end(); // 返回尾指针
v.cend(); // 返回const类型的尾指针
v.rend(); // 返回逆序尾指针
v.crend(); // 返回const类型的逆序尾指针
v.push_back(Test); // 末尾追加元素
st.push(Test); // 入栈
v.pop_back(); // 弹出末尾单个元素
st.pop(); // 出栈
s.size(); // 获取序列长度(元素个数)
s.length(); // 获取序列长度(元素个数)
s.c_str(); // 当前字符串的首字符地址
s.max_size(); // 获取序列最大大小
s.capacity(); // 查看容器容量
s.front(); //返否回头元素的引用
s.back(); // 返回尾元素的引用
se.insert(x); // 插入元素
se.empty(); // 判断是否为空
se.erase(se.begin()); // 弹出指定元素
v.resize(Test, x); // 序列易容
reverse(s.begin(), s.end()); // 反转
find(v.begin(), v.end(), 1); // 在指定范围内查找和目标元素值相等的第一个元素。
find_if(v.begin(), v.end(), emm); // 在指定范围内查找和目标元素值相等的第一个元素。
find_if_not(v.begin(), v.end(), emm); // 查找第一个不符合谓词函数规则的元素。
v.clear(); // 清空
remove(v.begin(), v.end(), 1); //移动元素到末尾
remove_copy(v.begin(), v.end(), v.begin(), 0.0); // 将前两个正向迭代器参数指定的序列中的元素复制到第三个参数指定的目的序列中,并忽略和第 4 个参数相等的元素
// 它返回一个指向最后一个被复制到目的序列的元素的后一个位置的迭代器。序列不能是重叠的。
remove_if(v.begin(), v.end(), emm); // 可以从前两个正向迭代器指定的序列中移除能够使作为第三个参数的谓词返回 true 的元素。
remove_copy_if(v.begin(), v.end(), v.begin(), emm); // 可以将前两个正向迭代器参数指定的序列中,能够使作为第 4 个参数的谓词返回 true 的元素,复制到第三个参数指定的目的序列中
// 它返回一个指向最后一个被复制到目的序列的元素的后一个位置的迭代器。序列不能是重叠的。
min_element(v.begin(), v.end()); // 获取序列最小值地址
max_element(v.begin(), v.end()); // 获取序列最大值地址
//permutation(); 全排列函数
is_permutation(s.begin(), s.end(), ws.begin(), ws.end()); // 用来检查一个序列是不是另一个序列的排列
next_permutation(v.begin(), v.end()); // 序列全排列:下一个排列
prev_permutation(v.begin(), v.end()); // 序列全排列:上一个排列
random_shuffle(v.begin(), v.end()); // 打乱序列(需srand()配合使用)
accumulate(v.begin(), v.end(), 0); // 序列累加
atoi(s.c_str()); // string -> int
//itoa();
equal(s.begin(), s.end(), ws.begin(), ws.end()); // 告诉两个序列是否匹配
mismatch(s.begin(), s.end(), ws.begin(), ws.end()); // 告诉两个序列是否匹配,如果不匹配,告诉我们不匹配的位置
lexicographical_compare(s.begin(), s.end(), ws.begin(), ws.end()); // 字符串排序
fill(s.begin(), s.end(), 1); // 填充整个序列
fill_n(s.begin(), 3, 1); // 以给定的迭代器为起始位置,为指定个数的元素设置值
s = to_string(Test); // int -> string
ws = to_wstring(Test);
isalpha(ch); // 是否为字母
isalnum(ch); // 是否字母或数字
isdigit(Test); // 是否为数字
islower(ch); // 是否是小写字母
isupper(ch); // 是否是大写字母
tolower(ch); // 转小写
toupper(ch); // 转大写
transform(s.begin(), s.end(), s.begin(), ::tolower); //transform为STL函数,全部小写
transform(s.begin(), s.end(), s.begin(), ::toupper); //transform为STL函数,全部大写
s.npos; // 长度?!
max(Test, x); // 求最大值
min(Test, x); // 求最小值
int u = 2, p = 2;
swap(u, p); // 交换值
stoll(s); // 解析str并将其内容解释为指定基数的整数,并将其作为long long int类型的值返回。
//getchar(); // 输入一个字符
putchar(ch); // 输出一个字符
puts(TEst); // 输出字符数组
cin.get(TEst, sizeof(TEst)); // 整行读入字符数组
fflush(stdin); // 缓冲输入(
getline(cin, s); // 整行读入字符串
memset(TEst, 'q', sizeof(TEst)); // 初始化数组
strcat(TEST, TEst); // 连接两个字符数组
strcpy(TEST, "handsome"); // 复制字符数组
strcmp(TEST, TESt); // 比较两个字符数组
s.compare(TESt); // 比较两个字符串
NULL, nullptr; // 空
gcd(6, 8); // 求最大公因数
lcm(10, 5); // 求最小公倍数
reverse_copy(s.begin(), s.end(), s.begin()); // 复制序列时反转元素的次序
sort(s.begin(), s.end()); // 升序排序
sort(s.begin(), s.end(), greater<int>()); // 降序排序
partial_sort(arr, arr + 5, arr + 8); // 使序列中的middle-first个最小元素以升序顺序排序
partial_sort(arr, arr + 5, arr + 8, greater<int>()); // 使序列中的middle-first个最小元素以降序顺序排序
partial_sort_copy(arr, arr + 5, arr + 9, arra); // 使序列中的middle-first个最小元素以升序顺序排序并拷贝到另一个数组中
partial_sort_copy(arr, arr + 5, arr + 9, arra, greater<int>()); // 使序列中的middle-first个最小元素以降序顺序排序并拷贝到另一个数组中
is_sorted(v.begin(), v.end()); // 是否为升序序列
is_sorted(v.begin(), v.end(), greater<int>()); // 是否为降序序列
is_sorted_until(v.begin(), v.end()); // 从序列中查找第一个未排序的元素,它使用二进制函数进行比较。
b.any(); // 是否含有设置为一的位
b.none(); // 是否所有位都为0
b.count(); // 否会被设置唯一的个数
b.set(); // 通过set()操作或下标操作符来设置某个单独的位的值
b.test(1); // 测试某个单独的位是否为一
b.reset(); // 用reset()操作或者下标操作符来将某个单独的为设置为0
b.flip(); // 翻转整个bitset对象或一个单独的位
copy(s.begin(), s.end(), s.begin()); // 复制...
copy_n(arr, 3, arr); // 允许自由选择必须在目标容器中复制多少元素
copy_if(arr + 1, arr + 10, arr, emm); // 容器指定范围的元素值中·满足的结果开始复制到容器中
copy_backward(s.begin(), s.end(), s.begin()); // 从序列的最后一个元素起进行反向复制。
//operator 重载操作符
//friend 友元函数和友元类
strncpy(TEst, s.c_str(), s.length()); // 把所指向的字符串复制到,最多复制n个字符.当长度小于n时,剩余部分将用空字节填充。
memcpy(TEst, s.c_str(), s.length()); // 从存储区str2复制n个字节到存储区str1...
snprintf(TEst, s.length(), s.c_str()); // 用于格式化输出字符串,并将结果写入到指定的缓冲区,与sprintf()不同的是,snprintf()会限制输出的字符数,避免缓冲区溢出.
partition(v.begin(), v.end(), emm); // 根据用户自定义的筛选规则,重新排列指定区域内存储的数据,使其分为 2 组,第一组为符合筛选条件的数据,另一组为不符合筛选条件的数据。
stable_partition(v.begin(), v.end(), emm); // 在分组的同时保证不改变各组中元素的相对位置
partition_copy(v.begin(), v.end(), arr, arra, emm); // 也能按照某个筛选规则对指定区域内的数据进行“分组”,并且分组后不会改变各个元素的相对位置。
// 更重要的是,partition_copy() 函数不会对原序列做修改,而是以复制的方式将序列中各个元组“分组”到其它的指定位置存储
partition_point(v.begin(), v.end(), emm); // 对于如何在已分好组的数据中找到分界位置
swap_ranges(v.begin(), v.begin() + 2, v.begin()); // 交换两个序列
return 0;
}