• STL模板和容器


    文中内容来自于程序员面试宝典,算是学习笔记

    标准模板库(STL,standard Template Library)
    一、STL有以下优点:
    1.可以方便、容易地实现搜索数据或对数据排序等一系列的算法。
    2.调试程序时更加安全和方便。
    3.即使是人们用STL在UNIX平台下写的代码,你也可以很容易的理解(因为STL是跨平台的)。
    二、STL中的一些基础概念的定义如下。
    1.模板(Template)类(及结构等各种数据类型和函数)的宏(macro)。有时叫做甜饼切割机
    (cookie cutter),正规的名称叫做泛型(generic)。一个类的模板叫做泛型类(generic
    class),而一个函数的模板也自然的被叫做泛型函数(generic function).
    2.STL标准模板库,一些聪明人写的模板,现在已成为每个人所使用的标准C++语言中的
    一部分。
    3.容器(container) 可容纳一些数据的模板类。STL中有vector、set、map、multimap
    和deque等容器。
    4.向量(Vector)基本数组模板,这是一个容器。
    5.迭代器(iterator),又叫游标,它是一个指针,用来指向STL容器中的元素,也可以
    指向其他的元素。
    总之,标准模板库是一个基于模板的容器类库,包含链表、列表、队列和堆栈。标准
    模板库还包含许多常用的算法,包括排序和查找。
    标准模板库容器类有两种类型:顺序容器和关联容器。顺序容器提供对齐成员的顺序
    访问和随机访问。关联容器则经过优化关键值访问他们的元素。所有STL容器类都在
    namespace std中定义。

    顺序容器包括:vector、list、deque
    其中:只有vector和deque容器提供下面两种重要的运算集合:迭代器算术运算,
    以及使用除了==和!=之外的关系操作符来比较两个迭代器(==和!=这两种关系运
    算适用于所有容器)。
    即vector和deque类型迭代器支持以下操作:
    vector<int>::iterator iter;
    iter±n
    iter1±iter2以及>,>=,<,<=等操作。
    例如,下面的语句用于计算vector对象vec的中点位置:
    iter=vec.begin()+vec.size()/2;
    另一方面,代码:
    //copy elements from vec into ilist
    list<int> lst(vec.begin(),vec.end);
    lst.begin()+lst.size()/2; //error:no addition on list iterators
    是错误的。list容器的迭代器既不支持算术运算(加法或减法),也不支持关系
    运算(>,>=,<,<=),它只提供前置和后置的自增、自减运算以及相等(不等)运算。

    C++使用一对迭代器标记迭代器范围,通常将它们命名为first和last,或begin和end,
    其中first和begin指向迭代器的第一个元素,而last和end指向最后一个元素的下一个
    位置。


    为了定义一个容器类型的对象,必须先包含相关的头文件,即下列头文件之一:
    #include<vector>
    #include<list>
    #include<deque>

    例1:vector的实现

    #include<iostream>
    #include<vector>
    using namespace std;

    void print(vector<int>);

    int main()
    {
        vector<int>  vec;
        vec.push_back(1);            //在容器vec的尾部添加值为1的元素,返回void类型
        vec.push_back(2);
        print(vec);
        vector<int>::iterator p;  //迭代器的方式进行元素访问
        p=vec.begin();
        *p=3;
        *(p+1)=4;
        print(vec);
        int i=0;
        while(i<vec.size())
            cout<<vec[i++]<<" ";
        cout<<endl;
        vec.pop_back(); //删除容器vec的最后一个元素。返回void,pop_front()则删除
        print(vec);          //第一个(vector类型不支持这个操作),vec.erase(p)删除
        vec.push_back(5);//器p所指向的元素。另,vec.back()和vec.front()分
        vec.push_back(6);//返回容器的最后一个和第一个元素的引用,用于访问元素
        i=0;
        while(i<vec.size())
            cout<<vec[i++]<<" ";
        cout<<endl;
        vec[0]=100;  //利用下标访问元素,数组的方式(只适用于vector和deque容器)
        vec[1]=101;
        vec[2]=102;
        i=0;
        while(i<vec.size())
            cout<<vec[i++]<<" ";
        print(vec);
        return 0;
    }

    void print(vector<int> v)
    {
        cout<<" vector size is:"<<v.size()<<endl;
        vector<int>::iterator p=v.begin();
    }

    运行结果为:

    vector size is 2
    vector size is 2
    3 4

    vector size is 1
    3 5 6
    100 101 102
    vector size is 3

    关键概念:容器中的元素都是副本
          在容器中添加元素时,系统是将元素值复制到容器里。类似地,使用
    一段元素初始化新容器时,新容器存放的是原始元素的副本。被复制的原
    始值与新容器中的元素各不相关,此后,容器内元素值发生变化时,被复
    制的原值不会受到影响,反之亦然。namespace std中定义。

  • 相关阅读:
    js字符串分割
    Maven打包出错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
    Kafka
    linux 切换PHP版本
    linux 查看服务状态及开发端口
    php消息队列
    windows 设置composer 淘宝镜像
    PHP使用CURL详解
    linux php7.0 安装redis扩展
    linux 快速查找安装目录方法
  • 原文地址:https://www.cnblogs.com/fuxianfeng1988/p/3264832.html
Copyright © 2020-2023  润新知