zoukankan      html  css  js  c++  java
  • 标准模板库

    可对矢量执行的操作

     所有的STL容器都提供了一些基本方法,其中包括size()-返回容器中元素数目,swap()-交换两个容器的内容,begin()-返回一个指向容器中第一个元素的迭代器,end()-返回一个表示超过容器尾的迭代器
    什么是迭代器?
     迭代器是一个广义的指针,它可以是指针,也可以是一个可对其执行类似指针操作的对象
    迭代器存在的意义?
     通过将指针广义化为迭代器,让STL能够为各种不同的容器类(包括那些简单指针无法处理的类)提供统一的接口。
    迭代器的用法?
     要为vector的double类型规范声明一个迭代器,可以这样做

      vector<double>::iterator pd;
    
    //假设scores是一个  vector<double> 对象,则可以使用迭代器pd执行这样的操作
    pd = score.begin();  //pd指向第一个元素
    *pd = 22.3; //赋值
    ++pd;  //让pd指向下一个元素
    

     可以用下面的代码来显示容器的内容

    vector<string> titles(NUM);
    
    vector<string>::iterator pd;
    pd=titles.begin();
    for(;pd != titles.end(); pd++)
    {
        cout << *pd <<endl;
    }
    

     vector模板类也包含一些只有某些STL容器才有的方法。如

    push_back()
    erase()
    insert()
    

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

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        vector<double> score;  //创建一个空的vector
        double temp;
        while(cin >> temp && temp >= 0)
        {
            score.push_back(temp);
        }
        cout << "you entered " << score.size() << " scores.
    ";
        vector<double>::iterator pd;
        pd=score.begin();
        for(;pd != score.end(); pd++)
        {
            cout << *pd <<endl;
        }
        return 0;
    }
    
    

    这样写的好处?
     在编写或运行程序时,无需了解元素的数目。只要能够取得足够的内存,程序就可以根据需要增加scores的长度
     erase()方法删除矢量中给定区间的元素
     insert()方法在矢量中的给定区间插入元素

    对矢量可执行的其他操作

    矢量模板类包含了执行常见操作,如搜索,排序,随机排序的方法了么?
    没有!
    STL的解决方案?
     STL从更广泛的的角度定义了非成员函数来执行这些操作
    STL这样解决的原因?
     1)省去了大量重复的工作
     2)即使有执行相同任务的非成员函数,STL有时也会定义一个成员函数。这是因为对有些操作来说,类特定算法的效率比通用算法的高。

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

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    void Show(const double &rr)
    {
        cout << rr << endl;
    }
    
    int main(int argc, char *argv[])
    {
        vector<double> score;  //创建一个空的vector
        double temp;
        while(cin >> temp && temp >= 0)
        {
            score.push_back(temp);
        }
        cout << "you entered " << score.size() << " scores.
    ";
        for_each(score.begin(),score.end(),Show);
        return 0;
    }
    

    Random_shuffle()函数用法?
     random_shuffle()函数接收两个指定区间的迭代器参数,并随机排列该区间中的元素。
    random_shuffle()该函数要求容器类允许随机访问
    sort()函数的用法?
    DEMO 以上三种STL函数的用法

    /*
     * 演示STL函数的用法
    */
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    struct Review{
        string title;
        int rating;
    };
    
    bool operator <(const Review & r1, const Review & r2);
    bool worseThan(const Review & r1, const Review & r2);
    bool FillReview(Review & rr);
    bool ShowReview(const Review & rr);
    
    int main(int argc, char *argv[])
    {
        vector<Review> books;
        Review temp;
        while(FillReview(temp))
        {
            books.push_back(temp);
        }
    
        if(books.size() > 0)
        {
            cout << "Thank you .You entered the following "
                 << books.size() << " ratings:
    "
                 << "Rating	Book
    ";
    
            for_each(books.begin(), books.end(), ShowReview);
    
            //排序
            sort(books.begin(), books.end());
            cout << "Sorted by title:
    Rating	Book
    ";
            for_each(books.begin(), books.end(), ShowReview);
    
            sort(books.begin(),books.end(),worseThan);
            cout << "Sorted by rating:
    Rating	Book
    ";
            for_each(books.begin(), books.end(), ShowReview);
    
            random_shuffle(books.begin(),books.end());
            cout << "After shuffling:
    Rating	Book
    ";
            for_each(books.begin(), books.end(), ShowReview);
    
        }
        else
        {
            cout << "No entries:";
        }
        cout << "Bye.
    ";
        return 0;
    
    
        return 0;
    }
    
    bool operator <(const Review & r1,const Review & r2)
    {
        if(r1.title < r2.title)
        {
            return true;
        }
        else if(r1.title == r2.title && r1.rating < r2.rating)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool worseThan(const Review &r1, const Review &r2)
    {
        if(r1.rating < r2.rating)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool FillReview(Review &rr)
    {
        cout << "Enter book title (quit to quit): ";
        getline(cin,rr.title);
        if(rr.title == "quit")
        {
            return false;
        }
        cout << "Enter book rating: ";
        cin >> rr.rating;
        if(!cin)
        {
            return false;
        }
        while(cin.get() != '
    ')
            continue;
        return true;
    }
    
    bool ShowReview(const Review & rr)
    {
        cout << rr.rating << "	" << rr.title << endl;
    }
    
    

    运行结果

    基于范围的for循环(C++11)

    泛型编程

    为何使用迭代器

    迭代器类型

    迭代器层次结构

    概念,改进和模型

    容器种类

    容器的概念?
     容器是存储其他对象的对象,被 存储的对象必须是同一种类型的,他可以是OOP意义上的对象,也可以是内置类型值。存储在容器中的数据为容器所有,这意味着容器过期时,存储在容器中的数据也将过期。
    不能将任何类型的对象存储在容器中,具体的说,类型必须是可复制构造的和可赋值的。基本类型满足这些要求,只要类定义没有将复制构造函数和赋值运算声明为私有或保护的,则也满足这种要求。

  • 相关阅读:
    窗体1打开窗体2的方法
    C#中窗体间传递数据的几种方法(转载)
    只读字段和常量
    Datepicker控件
    .NET中的加密和解密
    ASP.NET网页生命周期事件
    hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)
    我的第一次博客
    弹性布局
    HTML标签部分(块级/行级)
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/9800899.html
Copyright © 2011-2022 走看看