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

  • 相关阅读:
    AI ResNet V1
    Lua基础
    git命令小结
    定时器及时间轮
    expect
    vscode 常用快捷键
    动态链接库与共享内存:
    container_of机制
    ELF文件格式
    git学习补充
  • 原文地址:https://www.cnblogs.com/philo-zhou/p/14793184.html
Copyright © 2011-2022 走看看