STL学习

STL

  • 泛化编程template
    • 函数模板
    • 类模板
  • iterator迭代器
  • C++ array(STL array)容器

STL中文名为标准库,是C++标准的规定并且提供了自己编写STL的接口,在编译器实现中统一的分成立几个容器头文件和几个其他的头文件来完成数据结构和算法的抽象,现在编译器使用的是microsoft版本的,这种处理还泛化了接口。

泛化编程template

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

函数模板

template <typename type> ret-type func-name(parameter list)
{
   // 函数的主体
}

STL学习_第1张图片

类模板

template <class type> class class-name {
.
.
.
}
#include<iostream>
#include<vector>
using namespace std;

template<class T>class Stack{
private:
    vector<T>elems;
public:
    void push(const T&);
    void pop();
    T top() const;
    bool empty() const{
        return elems.empty();
    }
};

template<class T>void Stack<T>::push(T const&elem){
    elems.push_back(elem);
}
template<class T>void Stack<T>::pop(){
    if(elems.empty()){
        throw out_of_range("hahaha empty stack");
    }
    elems.pop_back();
}
template<class T>T Stack<T>::top()const
{
    if(elems.empty()){
        throw out_of_range("haha2233 empty stack");
    }
    return elems.back();
}
int main(){
    try{
        Stack<int> intStack;
        Stack<string>stringStack;

        intStack.push(7);
        cout<<intStack.top()<<endl;
        stringStack.push("666a");
        cout<<stringStack.top()<<std::endl;
        stringStack.pop();

        cout<<stringStack.top()<<std::endl;
        stringStack.pop();
    }
    catch(exception const&ex){
        cerr<<"exception"<<ex.what()<<endl;
        return -1;
    }
}

STL学习_第2张图片

iterator迭代器

迭代器按照定义方式分成以下四种。

  1. 正向迭代器,定义方法如下:
    容器类名::iterator 迭代器名;

  2. 常量正向迭代器,定义方法如下:
    容器类名::const_iterator 迭代器名;

  3. 反向迭代器,定义方法如下:
    容器类名::reverse_iterator 迭代器名;

  4. 常量反向迭代器,定义方法如下:
    容器类名::const_reverse_iterator 迭代器名;

#include
#include
using namespace std;
int main(){
    vector<int>v;
    for(int i=0;i<70;i++){
        v.push_back(i);
    }
    vector<int>::iterator j;
    for(j=v.begin();j<v.end();j++){
        cout<<*j<<' ';
        *j*=3;
    }

    for(vector<int>::reverse_iterator r=v.rbegin();r<v.rend();++r){
        cout<<*r<<' ';
    }
    return 0;
}

STL学习_第3张图片
迭代器按照功能分类
STL学习_第4张图片
STL学习_第5张图片
在这里插入图片描述

CDemo CDemo::operator++ ()
{  //前置++
    ++n;
    return *this;
}
CDemo CDemo::operator ++(int k)
{  //后置++
    CDemo tmp(*this);  //记录修改前的对象
    n++;
    return tmp;  //返回修改前的对象
}
#include
#include
using namespace std;
int main(){
    vector<int> v(100);
    for(int i=0;i<v.size();i++){
        cout<<v[i];
    }
    vector<int>::iterator i;
    for(i=v.begin();i<v.end();++i){
        cout<<*i;
    }
    for(i=v.begin();i!=v.end();++i){
        cout<<*i;
    }
    i=v.begin();
    while(i!=v.end()){
        cout<<*i;
        i+=2;
    }
    return 0;
}

STL学习_第6张图片
迭代器的辅助函数

#include
#include
#include
using namespace std;
int main(){
    int a[5]={1,2,3,4,5};
    list<int>lst(a,a+5);
    list<int>::iterator p=lst.begin();
    advance(p,3);
    cout<<"1往前移动3个单位是4:"<<*p<<endl;
    advance(p,-1);
    cout<<"往后挪动1个单位是3:"<<*p<<endl;
    list<int>::iterator q=lst.end();
    --q;
    cout<<"最后一个"<<*q<<endl;
    cout<<"3->5=2:"<<distance(p,q)<<endl;
    iter_swap(q,p);
    //交换3,5;
    for(p=lst.begin();p!=lst.end();++p){
        cout<<*p<<" ";
    }
    return 0;
}

STL学习_第7张图片

C++ array(STL array)容器

文件源码
自己写的粗略array容器

#include
#include
namespace std{
    template <typename T, size_t N>
    class arry{
    private:
        T elems[N];
    public:
        f1(){};
        f2(){};
        bianli()const{//
            ;;;
            
        }
        cunchu(const T&){
            
        }
    };
}
using namespace std;
int main(){
    std::arry<double, 10> values;

}

#include
#include
using namespace std;
int main(){
    array<int,4>values{};
    for(int i=0;i<values.size();i++){
        values.at(i)=2*i;
    }
    cout<<get<3>(values)<<endl;
    //不用迭代器
    if(!values.empty()){
        for(auto val=values.begin();val<values.end();val++){
            cout<<*val<<" ";
        }
    }
}

STL学习_第8张图片

你可能感兴趣的:(c++,学习,开发语言)