zoukankan      html  css  js  c++  java
  • 2013.7.19 STL库的学习

    STL提供了一组表示容器,迭代器,函数对象和算法的模板。

    容器是一个与数组类似的单元,可以存储若干个值。容器是同质的,即存储的值的类型一样。

    算法是完成特定任务的处方。

    迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。

    函数对象类似于函数的对象,可以是类对象和函数指针(包括函数名,因为函数名被用作指针)

    STL使能够构造各种容器(包括数组,队列,链表)和执行各种操作(搜索,排序和随机排列)。


    STL不是面向对象编程,而是一种通用编程技术(generic programming)


    一、vector模板类

    1、创建一个vector对象,将一个vector对象赋给另一个对象,使用【】操作符来访问vector元素,要是类成为通用的,应将它设计为模板类。这正是STL所做的在头文件vector中定义了一个vector模板。

    vector动态分配内存。

    #include <vector>
    using namespace std;
    vector<int>ratings(5);
    int n;
    cin>>n;
    vector<double>scores(n);
    //由于[]重载,因此创建vector对象后可以使用通常的数组表示法来访问各个元素
    ratings[0]=9;
    for(int i=0;i<n;i++)
    cout<<score[i]<<endl;
    

     2、分配器

    int NUM=3;
        vector<int> rating(NUM);
        vector<string> titles(NUM);
       
        cout<<"you will enter
    "<<NUM<<"booktitles and your rating"<<endl;
        int i;
        for (i=0; i<NUM; i++) {
            cout<<"enter title #"<<i+1<<":"<<endl;
            getline(cin, titles[i]);
            cout<<"enter your book rating"<<endl;
            cin>>rating[i];
            cin.get();
        }
        
        for (i=0; i<NUM; i++) {
            cout<<rating[i]<<':'<<titles[i]<<endl;
        }
    

      3、可对矢量执行的操作

    size()返回容器中元素个数,swap()交换两个容器的内容,begin()返回一个指向容器中第一个元素的迭代器,end()返回一个表示超过容器尾的迭代器。

    什么是迭代器,它是一个广义指针,事实上,它可以是指针,也可以是一个可对其执行类似指针的操作——如解除引用(如operator*())和递增(operator++())的对象,每一个容器都定义了一个合适的迭代器,改迭代器是一个名为iterator的typedef,其作用域为整个类。例如要为vector的double类型规范声明一个迭代器。

    vector<double>::iterator pd;

    vector<double>scores; //假设scores是vector<double>的对象。

    pd=scores.begin();

    *pd=22.3;

    ++pd;

    空字符和超过结尾的区别,空字符是一个值,而超过结尾是一个指向元素的指针(迭代器)

    push_back()是一个方便的方法,它将新元素添加到矢量尾,这样做时,它将负责内存管理,增加矢量长度,使之容纳新成员。

     

        vector<int> rating;
        vector<string> titles;
        
        int temple;
        while (cin>>temple&&temple>=0) {
            rating.push_back(temple);
        }
        cout<<"you enterd"<<rating.size()<<endl;
    

      erase()方法删除矢量中给定区间的元素,他接收两个迭代器参数。

    scores.erase(scores.begin(),scores.begin()+2);

    insert()方法和erase()方法相反,它接收3个迭代器参数。

    vector<int>old;

    vector<int>new;

    4、对矢量可执行的其他操作

    STL定义一个适用于所有容器类的非成员函数find()。

    介绍3个普遍的STL函数:for_each(),Random_shuffle(),sort()

    for_each()接收3个参数,前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(最后一个参数是函数对象)。for_each()将被指向的函数应用于容器区间的各个元素,被指向的元素不能修改容器元素的值。可以用for_each()代替for循环。

    vector<Review>::iterator pr;
    for (pr=books.begin(); pr!=books.end(); pr++)
                ShowReview(*pr);
    //可以替代为
    for_each (books.begin(),books.end(),ShowReview);
    //这样可避免显示地使用迭代器变量
    

    Random_shuffle()接收两个制定区间的迭代器参数,并随机排列。

    random_shuffle(books.begin(),books.end());

    将随机排列books矢量中的所有元素,与可用与任何容器类的for_each()不同,该函数要求容器类可以随机访问,vector类可以做到这一点。

    sort()类也要求容器可以允许支持随机访问


    二、通用编程技术

    面向对象编程关注的是编程的数据方面,而通用编程技术关注的是算法。之间的共同点是抽象和创建可重用代码但是理念决然不动。

    1、为何使用迭代器?

    模板使算法独立于数据的存储类型,而迭代器使算法独立于使用的容器类型。

    2、迭代器类型

    STL定义了5种迭代器,输入迭代器,输出迭代器,正向迭代器,双向迭代器,随机访问迭代器。

    输入迭代器是单向迭代器,可以递增,但不能倒退。

    输出迭代器只能修改容器值,而不能读取。

    正向迭代器总是按相同的顺序遍历一系列的值。使多次通行算法成为可能。既可以能够读取和修改数据,也可以使得只能读取数据。

    双向迭代器双向迭代器具有正向迭代器所以功能,并且同时支持两种递减操作符。

    随机访问迭代器,具有双向迭代器所以功能,同时添加了支持随机访问的操作。

    3、迭代器的层次结构

    4、容器种类

    11个容器

    5、序列(sequence) 

    可以通过添加要求来改进基本的容器概念。 

    vector可以反转容器,是最简单的序列类型,除非其他类型的特殊优点能够更好地满足程序的要求,否则默认使用这个类型。

    for_each(dice.begin(),dice.end(),Show);
    cout<<endl;
    for_each(dice.rbegin(),dice.rend(),Show);
    cout<<endl;

    deque模板类表示双端队列(double-ended quene)如果多操作发生在序列的起始和结尾处,则考虑deque数据结构。

    list模板类表示双向链表list在链表任意位置插入和删除时间都是一样的,强调元素的快速插入和删除。list也可以反转容器,与vector不同,list支持数组表示法和随机访问。

    6、联合容器

    4种

    7、函数对象

    8、算法

    • 非修改式序列操作
    • 修改式序列操作
    • 排序和相关操作
    • 通用数字运算
  • 相关阅读:
    悟透JavaScript(理解JS面向对象的好文章)
    ClassLoader的等级加载机制
    ClassLoader的类结构分析
    如何实现自己的ClassLoader
    Servlet的ClassLoader
    idea远程调试linux下的tomcat
    centos VM 识别U盘
    linux yum 命令
    centos 基本操作(快捷键开户终端,复制,粘贴,yum命令)
    CentOS 配置Apache+Mysql+PHP (yum)与卸载
  • 原文地址:https://www.cnblogs.com/ymonke/p/3203966.html
Copyright © 2011-2022 走看看