zoukankan      html  css  js  c++  java
  • ###STL学习--标准模板库

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

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

    一、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
    1. 函数对象

    2. 适配器

    3. 分配器

    二、References


    1. 迭代器和类属算法介绍
  • 相关阅读:
    在winform下实现左右布局多窗口界面的方法(一)
    C# 使用API检查域用户名和密码是否正确
    C#检查网络是否可以连接互联网
    总结:实体类和(XML或二进制)之间相互转(序列化和反序列化)
    XML和实体类之间相互转换(序列化和反序列化)
    C# XML反序列化与序列化举例:XmlSerializer
    XML文件与实体类的互相转换
    Message类的属性Msg所关联的消息ID
    C# Message 消息处理
    在.net中读写config文件的各种方法(自定义config节点)
  • 原文地址:https://www.cnblogs.com/gr-nick/p/3880243.html
Copyright © 2011-2022 走看看