zoukankan      html  css  js  c++  java
  • 【坑点集合】C++ STL 使用注意事项整理

    Intro

    简单整理了一些关于 C++ STL 的注意点。

    虽然大多数东西可以手写不过某些东西最好少造轮子,善用 STL 可以节约很多考场时间,简化实现。

    当然是时空限制和功能足够的前提下。

    Tips

    1. bool 数组是如果发现空间不是很对可以考虑 std::bitsetstd::vector<bool>。不过仅仅是单次访问 std::bitset 没有 bool 数组快。

    2. 常数较大的一些 STL 容器:std::stack/std::queue/std::deque/std::list/std::valarray/std::string...,这些东西能手写尽量手写。

    3. std::multisetcount() 函数的复杂度为 (O(log n + ans)),因此多多考虑用 std::map 实现 std::multiset 的功能。

    4. 直接对 std::set/std::multiset/std::map/std::multimap 进行 <algorithm> 库中的二分查找的复杂度为 (O(n)),正解应该用其自带的 lower_bound()/upper_bound() 函数,复杂度为 (O(log n))

    5. 善用 STL 中函数的特性(比如返回值)可以提升一些效率,示例:std::set5e6

    6. std::priority_queue 默认为大根堆,小根堆可以取负、重载运算符或 std::greater

    7. std::multimap 不支持 [] 下标访问。

    8. 在使用 std::vector 时可以尝试用 reserve() 预测数组的大小以提高效率。实测 push_back() 次数较多时 reserve() 后能快一倍。

    9. 许多 STL 容器都特化了 swap() 函数,可以实现 (O(1)) 交换。

    10. std::bitset 重载了流运算符,即可以用 cin/cout 输入输出。当然也可以用这个输出整数的二进制。

    11. std::nth_element 会改变元素在容器中的位置。

    12. std::vector 等序列容器进行下标访问是最好将 size() 函数的返回值转为 int。一个成功避免大问题的一个例子:for (int i = (int)v.size() - 2; i >= 0; i--) v[i] += v[i + 1]

    13. 使用 std::map<Key, Value>[] 下标访问方法是,如果无对应 Key 元素的话会新建一个,值为调用构造函数 Value() 的结果。

    14. STL 容器进行修改操作时需要注意迭代器被非法化的情况,被非法化的迭代器不能再使用。如使用 std::seterase(it)it 就被非法化了。std::vector 等也需要注意这种问题。各种容器增删操作非法化情况表

  • 相关阅读:
    php的webservice的soapheader认证问题
    训练与解码
    ajax 图片上传
    js倒计时
    数据分析有价值的博客
    [Luogu P5675][GZOI2017]取石子游戏
    [BZOJ4558/LOJ2025/Luogu3271][GZOI2016/JLOI2016/SHOI2016]方
    [BZOJ4557/LOJ2024/Luogu3267][GZOI2016/JLOI2016/SHOI2016]侦察守卫
    PKUWC2019游记
    随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/-Wallace-/p/14079263.html
Copyright © 2011-2022 走看看