string
动态数组(vector)
vector<数据类型>name
- 插入1:name.push_back//在动态数字最后一个添加
- 插入2:insert(it,x)//it是迭代器
- 获取长度:name.size()
- 删除:pop_back();
- 擦擦:erase[it],或者erase[begin,end]—[begin,end)//擦掉区间的值;
- 清空(划重点!!):clear函数虽然能清空vector,但是并不能清掉开的内存。有一种方法可以,定义一个空的vector,然后swap例子:
vector<int>a{
vector<int>b;
a.swap(b);//a是已经clear()的栈:
}
例题:
打印锯齿矩阵
堆积木
最后说明动态数组:可以嵌套使用,也可以是个数组(name)//vectora[100]或者vector<vector >a;
在常用的STL容器中,只有在vector和string中,才允许使用vi.begin()+x这种迭代器加上整数的写法。(这里的x指代常数)
集合(set)
不存在相同的元素;
- 插入:insert()
- 删除:erase()
- 查找:count();
- 获取个数:size();
映射(map)
- 插入需要借助元祖,或者直接定义
- 访问:直接dic[];
- 查找:count();
- first是key,second是value
栈(stack)
例题;
网页跳转//栈的用法很灵活,有时候需要一个或两个;
队列(queue)
- 出列:pop
- 入列:push
- 队首:front
- 是否为空:empty()
优先队列(priority_queue)
优先队列与队列一样(只不过优先队列是可以自动排序的 )
这里有个知识点,c++里的运算符重载,个人感觉目前看不太懂;
不过,没关系,从大到小排就用:
priority(int n,vector,less)
从大到小排就用
priority(int n.vector,greater)
当然也可以用元组来排序,先比第一个的大小,然后再比第二个;
例题
任务系统
n个最小和
双端队列(deque)
deque模版类 double-ended queue(双端队列) ,支持随机访问
支持前插和后插,比stack,queue更灵活;
deque用法全解
并查集
并查集有普通的,还有带权的;
主要有初始化,查找,合并三个操作(这里没有stl库所以需要自己来做)
初始化:一般是一个超大的数组,带权的是两是他们a[i]=i(如果还要满足其他关系的话就再设一个数组)//个人感觉这里是逻辑结构(想要增加限制,就要增加数组)
查找:我一般习惯用get(),这里还伴随者一个压缩和路径合成操作(这里也是我感觉最难的一个地方)
int get(int x)
{
if(father[x]==x)return x;
int y=father[x];
father[x]=get(x);//这里就是树压缩了!!
r[x]=(r[x]+r[y]+3)%3;//这里就是路径和层了(一条链的栈)
return father[x];
}
总结
通过着一段时间的学习,个人感觉自己不管是代码能力和逻辑思维能力上都有了长足的进步.