当前位置: 首页 > news >正文

###STL(标准模板库)

为什么80%的码农都做不了架构师?>>>   hot3.png

#@author:       gr
#@date:         2014-07-18
#@email:        forgerui@gmail.com

  下面进行STL的学习。希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率。下面的内容我想以知识点为总结,不再像《Effective C++》那样以章节进行总结,这样写可能毫无组织,但可以看到整个学习的历程。点击查看Evernote原文

一、Contents


  1. C++模板
    • 类模板
        template<typename T1, typename T2>
        class Test{
            //下面的函数使用了T1,T2模板
            int count(T1 x, T2 y){
                return x.num + y.num; 
            }
        };
    
    + 函数模板
    ```cpp
    //使用传进来的str构造一个容器类Container
    template<typename Container>
    T make(string str){
        return Container(str.begin(), str.end());
    }
    //-----------------------------------------------
    //make函数的使用vector, list, deque...
    vector<char> vStr = make<vector<char>>("hello");
    list<char> lStr = make<list<char>>("hello");
    deque<char> dStr = make<deque<char>>("hello");
    // ...
+ 成员函数模板(在类模板中,还可以使用成员函数模板,两者不受影响)
```cpp
    template<typename T1, typename T2>
    class Test{
        //下面的函数使用了T1,T2模板
        int count(T1 x, T2 y){
            return x.num + y.num; 
        }
        template<typename T>
        void show(T x){
            std::cout<<x.num<<endl;
        }
    };
    
2. 默认模板参数
```cpp
    template<typename T, typename Allocator = allocator<T> >
    class vector{
        // ...
    }

通过allocator<T>为第2个模板参数Allocator赋一个初值,allocator类型(用户自己定义的一个类)则在未提供第二个模板时使用。这样,vector<int>vector<int, allocator<int>都是可以的。

  1. 容器
    • 序列容器
      • vector<T>:提供对变长序列的随机访问
      • deque<T>:提供对变长序列的随机访问
      • list<T>:提供对变长序列的线性时间访问O(N),其中N是序列的当前长度。
    • 顺序关联容器
      • set<Key> 惟一的键
      • multi<Key> 可重复的键
      • map<Key, T> 惟一的键索引类型T
      • multimap<Key, T> 可重复的键索引类型T
        #include<map>
        using namespace std;
        int main()
        {
            map<string, long>directory;
            directory["A"] = 1;
            directory["B"] = 2;
            directory["C"] = 3;
            string name = "B";
            //查找name
            map<string, long>::iterator it = directory.find(name);
            if (it != directory.end())
                cout<<"find the str, value is "<<*it<<endl;
        }
  1. 类属算法
   //1. reverse: 逆序
   reverse(vector.begin(), vector.end());    
   //2. find: 在序列中查找特定值'e'
   string::iterator it = find(str.begin(), str.end(), 'e');
    //map中的find
    map<Key, T>::iterator it = _map.find(key);    
    //3. merge: 将两个容器中的东西拷贝到一个容器中
    /**
      * @func: merge
      * @params: first1, last1分别表示输入序列的起始和终止位置
      * @params: first2, last2分别表示另一个输入序列的起始和终止位置
      * @params: result表示合并后序列存放的位置
      * @example: 合并string与list到deque
      *      merge(str, str+strlen(str), list1.begin(), list1.end(), deque1.begin());
      *      merge(str.begin(), str.end(), list1.begin(), list1.end(), deque1.begin());
      * 
      * @comments: !!!注意,这里的两个输入都必须是升序排列的,否则报错
      */
    merge(first1, last1, first2, last2, result);
    //4. replace: 替换其中的值
    replace(a.begin(), a.end(), 'a', 'b');
    //5. copy: 拷贝一段东西到另一个容器中
    copy(a.begin(), a.end(), b.begin());
  1. 迭代器

    • 输入迭代器
    • 输出迭代器
    • 前向迭代器
    • 双向迭代器
    • 随机访问迭代器
    • 插入迭代器
      • back_insert_iterator
      • front_insert_iterator
      • insert_iterator
    • 流迭代器
      • istream_iterator
      • ostream_iterator
  2. 函数对象

  3. 适配器

  4. 分配器

二、References


  1. 迭代器和类属算法介绍

转载于:https://my.oschina.net/grnick/blog/296701

相关文章:

  • mysql-5.6的GTID复制的实现
  • 整理一些计算机基础知识!
  • QMake study(part 3)
  • 制作公安系统产品思路
  • 对象
  • Install Erlang in Ubuntu
  • [日常] imap协议读取邮件
  • Java数据类型
  • Linux内核的缓存
  • Javascript Promise 学习(上)
  • windows下mongoDB的环境配置
  • 使用Sublime Text 2 编辑Markdown
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • 03Go 类型总结
  • PHP打印常量
  • Google 是如何开发 Web 框架的
  • @angular/forms 源码解析之双向绑定
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • conda常用的命令
  • github从入门到放弃(1)
  • leetcode讲解--894. All Possible Full Binary Trees
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • ReactNative开发常用的三方模块
  • 初探 Vue 生命周期和钩子函数
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 手写一个CommonJS打包工具(一)
  • 推荐一个React的管理后台框架
  • 微信小程序:实现悬浮返回和分享按钮
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 追踪解析 FutureTask 源码
  • 阿里云移动端播放器高级功能介绍
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​第20课 在Android Native开发中加入新的C++类
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #162 (Div. 2)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (39)STM32——FLASH闪存
  • (C++17) std算法之执行策略 execution
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三)模仿学习-Action数据的模仿
  • (十八)SpringBoot之发送QQ邮件
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)认识微服务
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .Net 4.0并行库实用性演练
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net6Api后台+uniapp导出Excel
  • .net的socket示例
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面