天天用stl,但是有一些小技巧如果不知道,偶尔会导致TLE,这里说几个打比赛需要用到的。
主要是大概了解一下其底层原理:https://www.jianshu.com/p/834cc223bb57
就常用的几个:vector,map,unordermap,其他的想到再更新。
1:首先把所有的push_back操作都换成emplace_back
http://c.biancheng.net/view/6826.html
- emplace_back是c++11新东西,和push_back一样的用法,但是效率高。
- push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);
- emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
2:vector的扩容机制
我们平常用vector用的就是动态,但是vector是有容量限制的,当push_back元素时超过容量上限:会新申请一段更大的空间,并把原来的元素拷贝到新空间。
拷贝过程当然需要耗时,所以当知道自己的vector大概能多少时,可以创建时先申请一些空间,减少拷贝。
3:map和unorder_map
https://www.cnblogs.com/philo-zhou/p/14407862.html
好几次因为这个TLE,直接说结论:
- map的原理就是红黑树,你只需要知道红黑树的插入删除复杂度是0(1),但是查询的复杂度是2*log(N)就行。 红黑树当然是有序的。
- unorder_map的原理是哈希表,复杂度都是O(1)。 哈希表就根据哈希存储的,是无序的。
那么什么时候用map和unorder_map呢?
根据特性就可以知道:看需不需要最后有序地访问,不需要就用unorder_map!!!