标准模板库

可对矢量执行的操作

 所有的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.\n";
    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.\n";
    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:\n"
             << "Rating\tBook\n";

        for_each(books.begin(), books.end(), ShowReview);

        //排序
        sort(books.begin(), books.end());
        cout << "Sorted by title:\nRating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);

        sort(books.begin(),books.end(),worseThan);
        cout << "Sorted by rating:\nRating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);

        random_shuffle(books.begin(),books.end());
        cout << "After shuffling:\nRating\tBook\n";
        for_each(books.begin(), books.end(), ShowReview);

    }
    else
    {
        cout << "No entries:";
    }
    cout << "Bye.\n";
    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() != '\n')
        continue;
    return true;
}

bool ShowReview(const Review & rr)
{
    cout << rr.rating << "\t" << rr.title << endl;
}

运行结果

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

泛型编程

为何使用迭代器

迭代器类型

迭代器层次结构

概念,改进和模型

容器种类

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

posted @ 2018-10-16 21:46  尚修能的技术博客  阅读(228)  评论(0编辑  收藏  举报