暑假 robocom比赛前稍微整理了一下c++常用的一些运算符重载和STL知识点,

丢在这充个数

结构体 (Node){a,b};

重载运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1:

bool operator < (const Node &a, const Node &b ) {

if( a.x == b.x ) return a.y> b.y;

return a.x> b.x;

}

2:

struct Node{

int a,b;

bool operator <(const Node & tmp) const { //最后的const不能省

if (tmp.a!=a) return a<tmp.a;

return b<tmp.b;

}

};

Pair

1
2
3
4
5
6
7
8
9
**pair嵌套** pair<int,pair<int,char> > p;

pair<int,char> p(0,’z’);

p = make_pair(1,’A’); // p = pair<int,char>(1,’A’);

cout<<p.first << p.second;

typedef pair<int,int> pp;

重载运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
template<class Ty1,class Ty2> 

inline const pair<Ty1,Ty2> operator+(const pair<Ty1, Ty2>&p1, const pair<Ty1, Ty2>&p2) {

pair<Ty1, Ty2> ret;

ret.first = p1.first + p2.first;

ret.second = p1.second + p2.second;

return ret;

}

排序遵从字典序

Vector/list

1
2
3
Vector<int> u;

常用函数:u.front(), u.back()(访问首尾)u.empty(), u.clear(), u.begin(), u.end(),(首尾地址) u.push_back(), u.pop_back(),(末尾添加和删除) u.size(), u.erase(),(删除指定地址或范围)u.resize(), u.insert()

遍历:

1
2
3
4
5
6
7
8
9
10
11
vector<int>::iterator iter = u.begin();

for (; it != u.end(); it ++);

//或者

for (auto it = u.begin(); it != u.end(); it++);

//逆遍历

For (auto it = u.rbegin(); it != u.rend(); it--);

函数:resize、insert

stack

stack st;

top(取栈顶值),push(栈顶加入),pop(栈顶删除),size,empty,不能clear,遍历

Queue

queue q;

push(队尾添加), pop(删除队首), size, empty, front,back(访问首尾),不能clear,不能遍历

Deque

begin,end,front,back,push_back,push_front,pop_back,pop_front,clear,insert,erase,empty,size

Priority_queue

priority_queue q; (默认大根堆)

priority_queue<int, vector, greater> q; (小根堆)////取负数

size, empty, pop(删除堆顶), top(取堆顶), push,不能clear

Map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//建立非连续映射

map<char,int> mp;

//插入:

mp.insert(pair<char,int>(‘A’,1)); :key已存在无法插入

mp.insert(make_pair(‘A’,1)); //同上

mp[‘A’] = 1; :直接覆盖原有值


//迭代器遍历,查询key:it->first,查询value:it->second(已按key升序排序)

//寻找键值:

//不能直接访问不存在的key,先检mp.count(key)或者mp.find(key)

mp.find(key) == mp.end()表示键值不存在

mp.count(key) == 0 表示键值不存在 //不能定位


//函数:size(查询键值个数)、clear、erase 指定地址:

map<int,string>::iterator iter;

iter = mp.find(1);

if (iter!=mp.end()) mp.erase(iter);

//erase 指定键值

erase(‘A’);

map中元素自动按key升序排序(若键值不可排序可重载运算符)

set

set st;不可有重复数值,可以看成key与value相同的map

操作与map类似

Multiset

可以插入重复元素,count可以大于1,size函数返回元素个数而不是不同值的个数,erase会将所有对应的key全部删掉

删除一个:s.erase(s.find(key))

Set缺点:不能直接改变元素的值,优点:搜索删除具有对数复杂度

Bitset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bitset<位数> bitset1;

bitset<8> bitset1(12)//bitset1(string(“100101”));

bitset<4> b1(“1001”),b2(“0101”);

b1&=b2; cout<<b1&b2;

b1[0]为1,b1[1]为0

b1.count() == 2; 返回1的个数

b1.test(0) == true; 检查下标元素是0/1

b1.any() == true;(是否有1

b1.none() == false (是否无1

b1.all() == false(是否全为1

b1.flip()有参数反转下标,否则反转全部

b1.set() 所有位置为1,有参数下标处置1

b1.reset() 置0,同上

本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: Evanq