【C++ 4】、STL(容器、迭代器、算法、函数对象)的应用

STL的基本组件

一、容器,迭代器,算法,函数对象

在这里插入图片描述
用具体情况举例说明四者关系。
在这里插入图片描述
下面从针对一个具体的数据类型到多种数据类型来编写一个图中的transform

1、首先确定的容器类型,数组,算法为直接取负

先测试确定容器,数组,确定算法,函数
void transInv(int a[],int b[],int nNum){
    for(int i =0; i<nNum; i++){

        b[i]= - a[i];  //确定算法 -()

    }
}

void output(string name, ostream&os, int a[], int Nnum){
    os<<name<<"\t";
    for(int i = 0; i<Nnum; i++){
        os<<a[i]<<"\t";
    }
    os<<endl;
}

2、可以对多种数据类型操作的取反算法(不确定的容器类型,确定的算法)


不确定序列容器的,确定算法,函数
template<typename Input, typename Output>
void transInv(Input Inputbegin, Input Inputend, Output outputbegin){
    for(;Inputbegin!=Inputend;Inputbegin++,outputbegin++){
        *outputbegin = -(*Inputbegin);
    }
}

template<typename T>
void output(string name, ostream&os, T begin, T end){
    os<<name<<"\t";
    for(;begin!=end;begin++){
        os<<*begin<<"\t";
    }
    os<<endl;
}

3、可以对多种数据执行不同的算法(不确定的容器类型和多种算法)

template<typename T>
T op(T input){
    return input*input;
}

不确定算法
template<typename Input, typename Output, typename Operator>
void transInv(Input Inputbegin, Input Inputend, Output outputbegin,Operator op){
    for(;Inputbegin!=Inputend;Inputbegin++,outputbegin++){
        *outputbegin = op(*Inputbegin);
    }
}

对上面三个情况测试

void TestCont(){

    int nNum = 6;
    int a[nNum] ={1,2,3,4,5,6};
    output("a",cout,a,6);

    int b[nNum];
    transInv(a,b,nNum);
    output("b",cout,b,6);

    vector<double> vb(nNum);
    //vector<double> vb();
    transInv(a,a+6,vb.begin());
    output("vb",cout,vb.begin(),vb.end());

    transInv(a,a+6,vb.begin(),op<int>);
    output("vb",cout,vb.begin(),vb.end());

}

结果
在这里插入图片描述

1、容器

在这里插入图片描述
序列容器:排列次序取决于插入时机和位置
关联式容器:排列次序取决于特定准则

在这里插入图片描述

2、迭代器

在这里插入图片描述

3、函数对象

在这里插入图片描述

4、算法

在这里插入图片描述

二、set的使用

set存放学生信息,并进行增删改查

void TestStudentSet(){

    cout<<endl;
    set<studentInfo> studentSet;

    //增加
    studentSet.insert(studentInfo("Liyuxiang","21"));
    studentSet.insert(studentInfo("Xuxiangdong","14"));
    studentSet.insert(studentInfo("Lianjunwei","13"));
    output("studentSet",cout,studentSet.begin(),studentSet.end());

    //删除
    studentSet.erase(studentInfo("Xuxiangdong","14"));
    output("studentSet",cout,studentSet.begin(),studentSet.end());

    //查找
    set<studentInfo>::iterator iter;
    iter=studentSet.find(studentInfo("Lianjunwei","13"));
    cout<<*iter<<endl;
    //cout<<iter->_stuNam<<endl;

    //修改
    //iter 是常指针,
    //*iter->_stuNam ="Xuxiangdong",不可行;

    const_cast<studentInfo*>(&(*iter))->_stuNam = "XUXU";
    cout<<iter->_stuNam;
    output("studentSet",cout,studentSet.begin(),studentSet.end());

    //破坏结构
    const_cast<studentInfo*>(&(*iter))->_stuNum = "23";
    cout<<iter->_stuNum<<endl;
    output("studentSet",cout,studentSet.begin(),studentSet.end());

    studentSet.insert(studentInfo("Liyuxiang","22"));
    output("studentSet",cout,studentSet.begin(),studentSet.end());
}

结果

在这里插入图片描述
要提的是,修改13为23破坏了set的结构

三、map的使用

对字符串统计各字符个数

void TestMap(){

    map<char, int> s;
    char c[20]="gsudhfogiert";
    for(int i = 0; i<20; i++){

       if(isalpha(c[i])){
           c[i]=tolower(c[i]);
           s[c[i]]++;
       }
    }

    for(map<char,int>::iterator iter = s.begin(); iter != s.end(); iter++)
        cout<< iter->first<<" "<<iter->second<<endl;

}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值