一些STL

一些STL,第1张

STL总结
迭代器例子:`
set:: iterator it;

for(it = x.begin(); it != x.end(); ++it)
		 x.rbegin();	  x.rend;  ++	 (反向迭代器)

for(auto w: x)

排序: sort(v.begin(), v.end()) (包括字母)(less() / greater()

vector

vector a(n + 1); 能先开辟先开辟,如果输入失败又可能这里出问题了

vector b = a; 定义的时候等于,否则可能会出问题

map

默认key从小到大排序

自定义按value :sort cmp(paira, pairb) return a.second < b.second;

获取最大值: auto i = max_element(t.begin(), t.end(), cmp) (还有min_element)

map> m;

word[len] = set(); (只是创建空间, 会重置原数据)

返回出现次数:m.count(length)

可以mp.first(); mp.second();

pair

先比较第一个,第一个相同再比较第二个

当想插入两个: q.push(make_pair(0, 0));

string

大小转 小写:transform(s.begin(), s.end(), s.begin(),tolower)

小写转大写:toupper

有空格:getline(cin, s);

s.substr(0,n): 从1开始数n个

s.reverse(s.begin(), s.end()) : 字符串翻转

s.insert(pos,  string, pos1, size_n) : 从pos1开始数的第n个字符插在pos前
s.insert(pos, n, char c) : 在下标为pos前插入n个字符c (n个相同的)
.count(begin, end, "s");
set

去重 + 自动排序

multiset: 不去重(可以删除某个点)

s.erase(pos) 删除pos迭代器所选元素
s.erase(x.begin(), x.end()) 删除[begin, end)内所有元素
s.erase(elem) 删除值为elem的元素

set.count(string s) : set内有几个与s相同的 //string同样可用

set.count(begin, end, "s");
set.count("s");
queue
queue> q;
q.insert({a, b});
q.pop();
int c = q.front().first;
int d = q.front().second;
map, greater> mp;

for (auto w : mp) {
    cout << w.first;
		for (auto v : w.second) {
			cout << v;
            cout << w.first;
		}
	}
#include
对给定范围进行"排序" 
nth_element(l, set, r, compare)
a中第k小的值,第二个参数就应该填a+k-1
当元素较多时平均时间复杂度为O(N),元素较少时最坏情况下时间复杂度为O(N^2)。


求[first, last]这个区间中第n大小的元素,如果参数加入了compare函数,就按compare函数的方式比较。


sort函数底层使用的是快速排序算法 O(nlog2n) 其它:https://www.jianshu.com/p/a68390d78386

因此此题直接将字符画贴源码里直接交(PHP)能过。


a i ∣ a j > = l c m ( a i , a j ) a_i| a_j >= lcm(a_i, a_j) aiaj>=lcm(ai,aj)

对于 x,y (x≤y),若x∣y,那么 lcm(x, y) = y是一组解。


否则lcm(x, y) ≥ 2y > x or y,不可能是解。


于是就变成找序列中是不是存在一个数是另一个数的因数

LL其实代表long long*1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量不至于后面计算溢出 (1ll = 1, 2ll = 2)

看第 i 位是不是1,可以右移 i 位再 &1 看 u >> i & 1 (要从0开始枚举)

看取不取: state的u位置成1,说明选这个数,某种程度上可以代替数组 state | (1 << u)

奇偶本质是01

边权是0或者是1就可以转化成双端队列

scanf("%*d", &v[i]); 那个是跳过不读的意思

10进制转n进制: 取余倒排

二分:

int mid = (l + r) / 2; l = mid + 1, r = mid;

int mid = (l + r + 1) / 2; l = mid, r = mid - 1;

memeset( , 0x3f, ); 相当于每个都是0x3f3f3f3f (4个)

state |= x << i //不重,记数字 把x加到state的i位 <=> 第i位是x
auto &[k, v] : mp

将 xx 的二进制写两次等价于将 xx 后面添加一些’0’

离正方体最远最近的点是中心和脚

二分就是 最优化问题转化为判定性问题:

​ 判断一下满足或是不满足能不能再细分 问最小值的我们一般都会想到二分

一个二叉树的小常识: 二叉树节点 向下投影,映射成的数组序列就是 中序遍历序列

区间合并

两个vector 使v1的内容和v2的后半部分相同的最简单 *** 作:
v1.assign(v2.begin() + v2.size() / 2, v2.end());(copy也影响效率,不行)
对区间函数调用: v1.insert(v1.end(), v2.begin(), + v2.size() / 2, v2.end());​ (数组插到vector也可用)​
assign: 需要完全替换一个标准序列容器内容时

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/569817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存