zoukankan      html  css  js  c++  java
  • ACM需要知道的STL小技巧

    天天用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!!!

  • 相关阅读:
    Windows XP下安装和配置Apache2.2.22服务器+PHP5+Mysql5
    win7下80端口被(Pid=4)占用的解决方法
    netty入门实例
    java NIO经典实例
    Eclipse下快速打开本地文件插件EasyExplorer(转)
    Nexus配置
    Maven依赖(转)
    【原创】C#玩高频数字彩快3的一点体会
    【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
    【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历
  • 原文地址:https://www.cnblogs.com/philo-zhou/p/14793184.html
Copyright © 2011-2022 走看看