【坑点集合】C++ STL 使用注意事项整理
Intro
简单整理了一些关于 C++ STL 的注意点。
虽然大多数东西可以手写不过某些东西最好少造轮子,善用 STL 可以节约很多考场时间,简化实现。
当然是时空限制和功能足够的前提下。
Tips
开
bool数组是如果发现空间不是很对可以考虑std::bitset或std::vector<bool>。不过仅仅是单次访问std::bitset没有bool数组快。常数较大的一些 STL 容器:
std::stack/std::queue/std::deque/std::list/std::valarray/std::string...,这些东西能手写尽量手写。std::multiset的count()函数的复杂度为 \(O(\log n + ans)\),因此多多考虑用std::map实现std::multiset的功能。直接对
std::set/std::multiset/std::map/std::multimap进行<algorithm>库中的二分查找的复杂度为 \(O(n)\),正解应该用其自带的lower_bound()/upper_bound()函数,复杂度为 \(O(\log n)\)。善用 STL 中函数的特性(比如返回值)可以提升一些效率,示例:用
std::set过5e6。std::priority_queue默认为大根堆,小根堆可以取负、重载运算符或std::greater。std::multimap不支持[]下标访问。在使用
std::vector时可以尝试用reserve()预测数组的大小以提高效率。实测push_back()次数较多时reserve()后能快一倍。许多 STL 容器都特化了
swap()函数,可以实现 \(O(1)\) 交换。std::bitset重载了流运算符,即可以用cin/cout输入输出。当然也可以用这个输出整数的二进制。std::nth_element会改变元素在容器中的位置。对
std::vector等序列容器进行下标访问是最好将size()函数的返回值转为int。一个成功避免大问题的一个例子:for (int i = (int)v.size() - 2; i >= 0; i--) v[i] += v[i + 1]。使用
std::map<Key, Value>的[]下标访问方法是,如果无对应Key元素的话会新建一个,值为调用构造函数Value()的结果。STL 容器进行修改操作时需要注意迭代器被非法化的情况,被非法化的迭代器不能再使用。如使用
std::set的erase(it)后it就被非法化了。std::vector等也需要注意这种问题。各种容器增删操作非法化情况表。
【坑点集合】C++ STL 使用注意事项整理的更多相关文章
- 避坑 | Java8使用并行流(ParallelStream)注意事项
示例分析 /** * 避坑 | Java8使用并行流(ParallelStream)注意事项 * * @author WH.L * @date 2020/12/26 17:14 */ public c ...
- STL的注意事项
template是一个泛化的:使用template时开始仅仅是声明,具体的例如:k<int> a;叫做实例化显式实例化:类似k<int>a:明确指出哪种类型:隐式实例化:类似k ...
- 基础数据类型的坑和集合及深浅copy
一.基础数据类型的坑: 元组: 如果一个元组中,只有一个元素,且没有逗号,则该"元组"与里面的数据的类型相同. # 只有一个数据,且没有逗号的情况: print(tu1,type( ...
- BZOJ3578:GTY的人类基因组计划2(集合hash,STL)
Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信 ...
- C++坑点集合 - 1 隐式调用和默认实现的构造函数的坑
C++是一个编译器会替你在背后做很多事情的语言,包括模板实例化,按需要创造隐式的构造函数,默认构造你没有显式构造的成员,按需进行隐式转换和饮食构造等等,如果没有彻底了解清楚,就容易被这些编译器背后做好 ...
- 关于集合set ---STL
关于集合set的去重复,向集合中插入元素 #include<iostream>#include<set>using namespace std;int main(){ set& ...
- Hive_UDF函数中集合对象初始化的注意事项
UDF函数中定义的集合对象何时初始化 udf函数放在sql中对某个字段进行处理,那么在底层会创建一个该类的对象,这个对象不断的去调用这个evaluate(...)方法,截图如下: 1.1 如果说对 ...
- LCT的一些坑【已经变成坑点集合了233】
好了蠢蠢的我写了第一个LCT模板就炸掉了QAQ 开个blog记一下我能出多少锅. 1.splay写挂了hhh这个你真的是蠢 2.这个奇怪的东西 bool not_root(int x){return ...
- Swift入坑系列—集合类型
数组(Arrays) 字典(Dictionaries) 数组(Arrays) 在OC里面,NSArray和NSMutableArray这两个类可以存储任意类型的对象,并且不提供所返回对象的任何特别信息 ...
随机推荐
- debian修改crontab默认编辑器为vim
debian终端下默认编辑器为nano,比如crontab -e就会打开nano,这个编辑器用起来很不习惯,想修改为vim,当然,你的debian系统必须先安装vim.如果已经安装vim,请输入如下命 ...
- 卸载python安装的软件
python源码安装的软件是无法通过命令卸载的,这个可以通过记录安装过程的形式来卸载安装的软件 以 python2.7.2 为例,在这个目录中有一个 setup.py 的文件,很显然这是安装程序,还是 ...
- linux下内存释放
细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法 ...
- java 打包压缩包下载文件
1. 下载压缩包zip方法 @Override public void downloadZip(HttpServletResponse servletResponse) { String nowTim ...
- HttpClient4.5X使用-集成微服务
HttpClient4.5X使用-集成微服务 1.什么是HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直 ...
- CSS浮动和清除浮动
1.浮动float div配合float浮动来做页面的布局,浮动最常用的地方就是用来做布局.只有一个标签设置了浮动float属性,就会变成块级标签. <!DOCTYPE html> < ...
- Java web 自动备份数据库和log4j日志
利用监听自动备份 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns: ...
- c++11-17 模板核心知识(八)—— enable_if<>与SFINAE
引子 使用enable_if<>禁用模板 enable_if<>实例 使用Concepts简化enable_if<> SFINAE (Substitution Fa ...
- Redis 用的很溜,了解过它用的什么协议吗?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- 已安装的nginx添加其他模块
总体操作就是添加新模块并重新编译源码,然后把编译后的nginx可执行文件覆盖原来的那个即可.1 查看已安装的参数nginx -V拷贝那些巴拉巴拉的参数,后面编译的时候使用 2 下载相同版本号的源码,解 ...