3.11

今天学习如何优雅的写代码
人话:如何偷懒(bushi)和调错

开代码前

1.-Wall
用途:帮你查重变量/未赋值变量等
用法:工具-编译选项-编译时加入以下命令中填写“-Wall"
2.-O2
用途:帮你查速度
用法:工具-编译选项-编译时加入以下命令中填写“-O2"

注意!要加空格而不是分号!

stl

1.(multi,unordered)map
用途:用一个key映射一个值

map<int,int> _map;//一个int对int的map 
multimap<int,int> _multimap;//一个int对int的map,key可重,返回第一个值
unordered_map<int,int> _unordered_map;//一个int对int的无序map,没区别 
unordered_multimap<int,int> _unordered_multimap;//一个int对int的无序multimap,更没区别
//插入元素 
_map.insert(make_pair(1,1));//插入一个key为1,值为1的元素 
/*等价于*/_map[1]=1; 
//查找元素
_map.find(1)//查找键值为“X”的元素
//使用元素
cout<<_map[1]; 
//交换两map 
_map.swap(_map);//用_map换 _map ~~其实没意义~~ 
//删除元素 
_map.erase1()//删除键值为“ x ”的元素,以上述代码为例,删除键值为”1“的元素

2.(multi,unordered)set
用途:检查元素是否存在

set<int> _set;
_set.insert(1);
cout<<_set.begin()//返回set容器的第一个元素
cout<<_set.end()//返回set容器的最后一个元素
cout<<_set.upper_bound(0)//返回大于某个值元素的迭代器
cout<<_set.empty()//判断set容器是否为空
cout<<_set.size()//返回当前set容器中的元素个数 
cout<<_set.find(1)//返回该元素的迭代器(第几个) 
cout<<_set.erase()//删除set容器中值为“1”的元素 

3.vector
用途:数组……等(太多了说不完)

vector<int> _vector; 
_vector.push_back(1);
cout<<_vector.size();
cout<<_vector[0];
_vector.pop_back();

4.deque
用途:包括但不限于当栈和队列

deque<int> _deque; 
_deque.push_back(1);
_deque.push_front(1);
cout<<_deque.front()<<_deque.back();
_deque.pop_back();
_deque.pop_front();
//注:都知道百万dq过大江吧……别开太多…… 

5.array
用途:基本没有

// 1. 创建空array,长度为3; 常数复杂度
std::array<int, 3> v0;
// 2. 用指定常数创建array; 常数复杂度
std::array<int, 3> v1{1, 2, 3};

v0.fill(1);  // 填充数组

// 访问数组
for (int i = 0; i != arr.size(); ++i) cout << arr[i] << " ";

6.list
用途:链表,可能有用,不过vector大概率已经够用了
7.priority_queue
用途:堆,默认大根堆

priority_queue <int> _priority_queue ;
priority_queue <int,vector<int>,greater<int> > _xiaopriority_queue ;//这是小根堆

函数

1.pair
略。
2.tuple
只能定一个的结构体,但也不是完全没用(吧)
3.complex
复数,但一般当pair。


综上,以上那三你不用也无伤大雅
那为什么要记?
因为讲了……


4.string
用途:字符串。
但它的用途远不止于此
basic_string<int>就是数串
5.bitset
用途:没讲???
只得自己翻找资料ing……
6.buildin系列

总结一下位运算的好用函数

这些函数都有相应的usigned long和usigned long long版本,只需要在函数名后面加上l或ll就可以了,比如int __builtin_clzll。

1.int __builtin_clz (unsigned int x)
例如对于

	
	以下输出均为2
	
	int x=3;
    cout<<32-__builtin_clz(x)<<endl;
   	
    
    long long x=3;
    cout<<64-__builtin_clzll(x)<<endl;
输出为 2
常用于求最高位位数

2.int __builtin_ffs (unsigned int x)
	
	输出为 3
	
    int x=4;
    cout<<__builtin_ffs(x)<<endl;
3.int __builtin_ctz (unsigned int x)
	
	输出为 3

    int x=8;
    cout<<__builtin_ctz(x)<<endl;
4.int __builtin_popcount (unsigned int x)
	
	输出为 3

	int x=7;
    cout<<__builtin_popcount(x)<<endl;
5.int __builtin_parity (unsigned int x)
int n = 15;//二进制为1111
int m = 7;//111
cout<<__builtin_parity(n)<<endl;//偶数个,输出0
cout<<__builtin_parity(m)<<endl;//奇数个,输出1

6.__lg
=log_2 sth
7.序列操作函数
一坨
8.memset 略
9.memcpy 会用memset基本足矣
10.count/element
11.accmulate
12.exp,即ex
13.atan2,基本只有几何题有用
14.__gcd 略
15.auto 自动推断类型
16.__int128/___float128 略
17.range-for
18.assert
19.mt19937
种子定义后,以后用rnd()调用即可

trick

1.陈潇然的洛谷uid当种子挺好用的——fxt

mt19937 rnd(28382);

2.内建列表结构
如:for(int i:{0,1,2})
3.lambda表达式

posted @ 2025-03-15 22:24  yzc_is_SadBee  阅读(28)  评论(0)    收藏  举报