• STL标准模板库(简介)


    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应用框架,高度体现了软件的可复用性。

    1.STL简介

    STL最初由惠普实验室开发,并于1998年被定义为国际标准,正式成为C++语言的标准库。在STL中采用了泛型编程的方法,泛型编程是通过模板来实现算法源代码,并将其用于不同数据类型的软件重用方法。从根本上说,STL是一些容器、算法和其他一些组件的集合,这些容器有list,vector,set,map等。STL已经是标准化组件,在使用时不需要重新开发,直接使用现有的组件。因此,使用STL编写程序会更加容易和高效。

    在C++标准中,STL被组织成下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。通常STL中最重要的是算法和容器,而迭代器将二者统一起来,每个容器都有自己的迭代器,算法通过迭代器来定位和操纵容器中的元素。

    C++标准库提供了众多的类和函数,可以完成更多的功能,当我们编写程序时,我们定义的类名和函数名可能和标准库中的某个名称相同。为了避免这种情况所造成的名称冲突,C++标准库中的一切类和函数都放在命名空间std中。

    a、新的C++头文件如<iostream>包含的基本功能和对应的旧文件(<iostream.h>)相同,但头文件的内容包含在std命名空间中;
    b、具有C库功能的新C++头文件具有如<cstdio>这样的名字,它们提供的内容和相应的C头文件相同,只是内容在std中。

    标准STL序列容器:vector、string、deque和list。
    标准STL关联容器:set、multiset、map和multimap。

    更多的STL知识,可见《EFFECTIVE STL中文版:50条有效使用STL的经验 》,这里简单介绍string、vector、list和map四种。

    2.string类型

    与其他标准库类型一样,如果用户要使用string类型,必须包含相关头文件:

    #include<string>
    using std::string;

    a、string对象的初始化

    string s1;
    cin>>s1;
    string s2(s1);
    string s3("abcdef");
    string s4(s3,2);//s4="ab"
    string s5(s3.begin(),s3.begin()+2);//s5="ab"
    string s6(s3,2,3);//s6="cde"
    string s7(5,'x');//s7="xxxxx"

    b、string对象的输入输出

    string对象的输入输出与基本类型的输入输出类似,可直接使用cout、cin以及<<、>>运算符。

    c、string类的基本操作

    s1=s2;//赋值
    s1.empty();//判断是否为空
    s1.size();//字符的个数
    s1[n];//位置为n的字符,从0开始计数
    s+=s2;s1=s1+s2;//追加字符串
    s1.insert(pos,s2);//在下标为pos的元素前插入s2表示的串
    s1.insert(pos,cp,len);//在下表pos前插入cp的前n个字符
    s1.c_str();//返回s1表示的字符串的首地址,char *
    s1.substr(pos,n);//获得从pos开始的连续n个字符
    s1.append(s2);//s2追加到s1的后面形成新串
    s1.append(cp);//将字符指针cp指向的字符串追加到s1后,形成新串
    s1.replace(pos,len,s2);//从pos开始的len个字符替换为s2
    s1.find(s2,pos);//从pos处开始查找,返回s2在s1第一次(s2的首字符对应的)出现的位置,否则返回string::npos
    s1.rfind(s2,pos);//从pos处开始查找,返回s2在s1最后一次(s2的首字符对应的)出现的位置,否则返回string::npos
    s1.find_first_of(s2,pos);//从pos开始查找s2的任意字符,找到后返回第一次出现的位置
    s1.find_last_of(s2,pos);//从pos开始查找s2的任意字符,找到后返回最后一次出现的位置

    3.vector类型

    注意:vector是一个类模板,而非数据类型

    a、vector对象的初始化

    vector<int> ivec;
    vector<int> ivec1(ivec);//定义ivec1,并用ivec初始化
    vector<int> ivec2(n,i);//包含n个值为i的元素
    vector<int> ivec3(n);//包含n个元素

    b、vector类常用的接口

    reserve(size_type n);//设置向量长度,使其容纳n个元素,原有元素和size()不变
    size_type capacity() const;//返回容量
    iterator begin();//返回第一个元素的迭代器
    iterator end();//返回最后一个元素的下一个元素的迭代器
    reverse_iterator rbegin();//返回reversed vector的第一个元素的迭代器
    reverse_iterator rend();//返回 reversed vector的最后一个元素的下一个元素的迭代器
    
    void resize(size_type n, T x=T());//调整向量的大小,并设置每个元素的初值
    size_type size();//元素数目
    bool empty() const;//判断是否为空
    reference at(size_type pos);//返回下标是pos的元素的引用
    reference operator[](size_type pos);//返回下标是pos的元素的引用
    reference front()//返回第一个元素的引用
    reference back();//返回最后一个元素的引用
    
    void push_back(const T &x);//在最后一个元素后添加新元素
    void pop_back();//删除最后一个元素
    
    void assign(const_iterator front, const_iterator last);//清空向量,连续插入迭代器front和last之间的所有元素
    void assign(size_type n, const T&x=T());//清空元素,连续插入n个元素x
    
    iterator insert(iterator it, const T& x=T());//在it元素前插入x
    void insert(iterator it, size_type n, const T& x);//在it元素前插入n个元素x
    void insert(iterator it, const_iterator front, const_iterator last);//在it前插入front和last之间的所有元素
    
    iterator erase(iterator it);//删除第it个元素,后续元素前移
    iterator erase(iterator front, iterator last);//删除front和last之间的元素
    void clear();//将容器清空
    void swap(vector x);//与容器x的内容交换

    c、迭代器

    定义迭代器vector<T>::iterator it;迭代器类似于指针,可以使用*it来访问相应元素,容器的begin()和end()函数都是常用接口,在程序设计时注意灵活使用。

    为了减少向量每次都需要申请和释放空间操作,vector容器每次在申请内存时,都会额外申请一块连续的存储区,用于存放新加入的元素,从而不必每次都为新元素重新分配一次容器。vector容器的存储状态如图:

    image

    4.map映射

    map是STL总常用的一种关联容器,它提供了一对一的数据处理能力,由于这种特性,映射通常可以用来实现字典结构。

    a、map构造函数

    map<int, char*> mapStudent;//关键字类型为int,键值类型为char*

    b、数据的插入有三种方法

    用insert函数插入pair数据,pair是<utility>头文件中定义的struct,在STL中凡是“必须传回两个值”的函数,都会用到pair

    mapStudent.insert(pair<int, char *>(1,"one"));

    用insert插入value_type数据

    mapStudent.insert(map<int, char *>::value_type(1,"one"));

    使用数组方式插入数据

    mapStudent[1] = "one";

    如何判断插入成功与否问题

    void main()
    {
        map<int, char *> mapStudent;
        pair<map<int, char *>::iterator, bool> Insert_Pair;
        Insert_Pair = mapStudent.insert(pair<int, char *>(1, "one"));    
        if(Insert_Pair.second == true)
        {cout<<"Success"<<endl;}
        else
        {cout<<"Failure"<<endl;}
    }

    c、map的大小:mapStudent.size();

    遍历:

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

    数据的查找:count计数关键字出现的次数,返回只能是0(没出现)或1(出现);使用find

    map<int, char*>::iterator iter = mapStudent.find(1);
    if(iter != mapStudent.end())
    {cout<<"Find"<<endl;}
    else
    {cout<<"No"<<endl;}

    数据的清空与判空:clear()和empty()

    d、数据的删除,erase有三个重载函数

    map<int, char *>::iterator iter;
    iter = mapStudent.find(1);
    mapStudent.erase(iter);
    int n = mapStudent.erase(1);//删除了会返回1,否则返回0
    mapStudent.erase(mapStudent.begin(), mapStudent.end());//清空map

    5.list链表

    list将元素按顺序储存在链表中。 与vector相比,它允许快速的插入和删除,但是随机访问却比较慢。list对象函数

    assign() ;//给list赋值 
    begin() ;//返回指向第一个元素的迭代器 
    end() ;//返回末尾的迭代器 
    clear();// 删除所有元素 
    empty() ;//如果list是空的则返回true 
    erase() ;//删除一个元素 
    front() ;//返回第一个元素 
    back() ;//返回最后一个元素 
    get_allocator() ;//返回list的配置器 
    insert() ;//插入一个元素到list中 
    max_size() ;//返回list能容纳的最大元素数量 
    merge() ;//合并两个list ,一般是组合起两个排好序的表
    splice() ;//合并两个list
    pop_back();// 删除最后一个元素 
    pop_front() ;//删除第一个元素 
    push_back() ;//在list的末尾添加一个元素 
    push_front() ;//在list的头部添加一个元素 
    rbegin() ;//返回指向第一个元素的逆向迭代器 
    rend() ;//指向list末尾的逆向迭代器
    remove() ;//从list删除元素 
    remove_if() ;//按指定条件删除元素 
    resize() ;//改变list的大小 
    reverse() ;//把list的元素倒转 
    size() ;//返回list中的元素个数 
    sort();// 给list排序 
    swap();// 交换两个list 
    unique();// 删除list中重复的元素

    STL的各个容器之间的操作有很多近似之处,先介绍到这里。

  • 相关阅读:
    div布局改进treeview导航
    WEB框架研究笔记八(HIBERNATE)
    WEB框架研究笔记四(Spring Framework)
    WEB框架研究笔记二(Extjs调用Struts)
    WEB框架研究笔记九(PowerDesigner)
    WEB框架研究笔记七(Spring2+struts2)
    WEB框架研究笔记十(JPA)
    WEB框架研究笔记11(第一阶段完成)
    WEB框架研究笔记五(Spring Aop)
    WEB框架研究笔记三(连接数据库)
  • 原文地址:https://www.cnblogs.com/houkai/p/3565387.html
Copyright © 2020-2023  润新知