c++ STL

作者: 李永开 | 来源:发表于2021-08-30 17:20 被阅读0次

    一.STL: standard template library(C++标准模板库)

    • STL共有六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器
    1. 容器:各种数据结构,如vector、list、deque、stack、set、map等用来存放数据,从实现来看,STL容器是一种class template
    2. 算法:各种常用的算法,如sort find copy for_each,从实现角度看,STL算法是一种function template
    3. 迭代器:扮演了容器与算法之间的胶合剂,共有五种类型。从实现角度来看,迭代器是一种将operator* operator-> operator++ operator--等指针相关操作予以重载的class template。所有的STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针也是一种迭代器
    4. 仿函数(函数对象): 行为类似函数,可作为算法的某种策略。从实现角度看,仿函数是一种重载了operator()的class 或者 class template
    5. 适配器: 一种用来修饰容器或者仿函数或者迭代器接口的东西
    6. 控件配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了空间动态配置 空间管理 空间释放的class template

    二.vector 向量

    //
    //  main.c
    //  cdemo
    //
    //  Created by liyongkai on 2021/6/6.
    //
    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    
    
    int main(int argc, const char * argv[]) {
    
        vector<int> v;//声明一个容器,这个容器里面存放int类型数据
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
        
        //利用迭代器,遍历容器中的数据
        vector<int>::iterator itBegin = v.begin();  //itBegin指的是v容器中的起始位置
        vector<int>::iterator itEnd = v.end();      //itEnd指的是v容器中的最后一个位置的下一个地址
        
        while (itBegin != itEnd) {
            cout << *itBegin << endl;
            itBegin ++;
        }
        
        return 0;
    }
    
    //
    //  main.c
    //  cdemo
    //
    //  Created by liyongkai on 2021/6/6.
    //
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    void myPrint(int v){cout << v << endl;}
    
    int main(int argc, const char * argv[]) {
    
        vector<int> v;//声明一个容器,这个容器里面存放int类型数据
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
        
        //利用迭代器,遍历容器中的数据
        vector<int>::iterator itBegin = v.begin();  //itBegin指的是v容器中的起始位置
        vector<int>::iterator itEnd = v.end();      //itEnd指的是v容器中的最后一个位置的下一个地址
        
        for_each(itBegin, itEnd, myPrint);
        
        return 0;
    }
    

    三.练习

    //
    //  main.c
    //  cdemo
    //
    //  Created by liyongkai on 2021/6/6.
    //
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <deque>
    using namespace std;
    
    class Person {
    public:
        Person(string name, int sorce){
            this->name = name;
            this->sorce = sorce;
        };
        string name;
        int sorce;//平均分
    };
    
    
    void createPerson(vector<Person> &v) {
        string names = "ABCDE";
        for (int i = 0; i < 5; i ++) {
            string name = "选手";
            name += names[i];
            
            int sorce = 0;
            Person p(name, sorce);
            v.push_back(p);
        }
    };
    
    
    void setScore(vector<Person> &v){
        for(vector<Person>::iterator it = v.begin(); it!=v.end(); it ++) {
            //对5个人进行打分
            deque<int> d;
            for (int i = 0; i < 10; i ++) {
                int score = rand()%41 + 60; // 60-100
                d.push_back(score);
            }
                    
            //排序,默认从小到大
            sort(d.begin(), d.end());
            
            //打印
            for (deque<int>::iterator dit = d.begin(); dit!=d.end(); dit++) {
                cout << "打分" << *dit << " ";
            }
    
            //去除最高和最低
            d.pop_back();
            d.pop_front();
            
            //计算平均值
            int sum = 0;
            for (deque<int>::iterator dit = d.begin(); dit!=d.end(); dit++) {
                sum += *dit;
            }
            int avg = sum/d.size();
            cout << "------->平均分为" << avg;
            cout << endl;
            
            //赋值
            (*it).sorce = avg;
        }
    }
    
    int main(int argc, const char * argv[]) {
        //创建容器,存放选手
        vector<Person>v;
        
        //创建5名选手,放入v中
        createPerson(v);
            
        //打分
        setScore(v);
        
        //打印测试下
        for (vector<Person>::iterator it = v.begin(); it != v.end(); it++) {
            cout << (*it).name << "的分数是" << (*it).sorce << endl;
        }
    
        
        return 0;
    }
    
    打分62 打分62 打分69 打分72 打分74 打分78 打分80 打分85 打分95 打分98 ------->平均分为76
    打分60 打分72 打分73 打分80 打分83 打分90 打分93 打分97 打分97 打分97 ------->平均分为85
    打分60 打分62 打分67 打分69 打分77 打分80 打分80 打分88 打分89 打分95 ------->平均分为76
    打分60 打分61 打分64 打分70 打分71 打分76 打分78 打分86 打分88 打分92 ------->平均分为74
    打分66 打分67 打分68 打分71 打分71 打分80 打分90 打分94 打分94 打分98 ------->平均分为79
    选手A的分数是76
    选手B的分数是85
    选手C的分数是76
    选手D的分数是74
    选手E的分数是79
    

    四.deque容器

    两端插值,常系数时间

    五.stack容器

    栈,你懂得

    六.queue容器

    额,就是队列

    七.list容器

    相当于可变数组

    八.set容器

    就是集合

    九.map容器

    就是字典啊

    十.pair对组

    字典用的到

    十一.谓词

    • 谓词是指普通函数或者重载的operator()返回值是bool类型的函数对象(仿函数)
      一元谓词:接收1个参数
      二元谓词:接收2个参数

    十二.内建函数对象

    #include <functional>

    int main(int argc, const char * argv[]) {
      
        //取反
        negate<int>n;
        cout << n(10) << endl;//-10
    
        //相加
        plus<int>p;
        cout << p(1,2) << endl;//3
    
       
        return 0;
    }
    

    十三.适配器

    先bind2nd
    后继承class Person : public binary_function

    相关文章

      网友评论

          本文标题:c++ STL

          本文链接:https://www.haomeiwen.com/subject/vuqoiltx.html