STL入门

1、STL是什么

STL = Standard Template Library,是一个函数库。STL 是由 C++模板编写的一套己纳入 c++标准的类库, 该库解决了通用数据结构与算法的问题。

STL 它是由 Alexander Stepanov、 Meng Lee 和 David R Musser 在惠普实验室工作时所开发出来的。亚历山大·斯特潘诺夫(AlexanderStepanov)——STL(标准模板库)之父, 并因此而荣获第一届 Dr. Dobb's 程序设计杰出奖, 现在是 Adobe 公司首席科学家。

STL源码地址链接在这里

2、STL的一个小程序示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>//bind需要这个头文件

using namespace std;

class  compare
{
public:
    bool operator()(int x , int y)
    {
        return x>y;
    }
};

int main()
{
    int arr[7] =  {1,2,3,4,8,6,9};
    vector<int> vi ;
    vi.assign(arr, arr+7);
    vector<int>::iterator itr;
    for(itr=vi.begin() ; itr != vi.end() ; ++itr)
    {
        cout<< *itr << endl;
    }
    cout << "------------------------------------" << endl;
    sort(vi.begin(),vi.end(),compare());  //仿函数匿名对象
    for(itr=vi.begin() ; itr != vi.end() ; ++itr)
    {
        cout<< *itr << endl;
    }
    cout << "------------------------------------" << endl;
    int count = count_if(vi.begin(),vi.end(),bind(less<int>() , placeholders::_1,5));//bind绑定对象所用
    int count = count_if(vi.begin(),vi.end(),bind(greater<int>() , placeholders::_1,5));//求大于5的数
    cout << count << endl;
    return 0;
}

3、STL组成图示

上面图示代码中的itr,可以看做是一个智能指针。使itr有了指针这种特性。

sort函数使用要包含#include <algorithm>算法库。

4、容器的特性

容器就是存储数据的地方。容器分为顺序容器(vector、list),关联容器(map)、无序容器。

特点1:支持泛型

容器中的数据不光可以是基本数据类型,也可以是自己定义的类。

比如:A是一个类vector<A> va;

特点2:保存副本

用一段代码来说明

#include <iostream>
#include <vector>

using namespace std;

class  A
{
public:
    A(int d = 0)
        :_data(d)
    {
        cout << "构造器" << this << endl;
    }

    ~A()
    {
        cout << "析构器" << this << endl;
    }

    A& operator=(const A& another)
    {
        cout << "赋值运算符重载" <<this << endl;
    }

    A(const A& another)
    {
        cout << "拷贝构造器" << this <<endl;
    }
private:
    int _data;
};

int main()
{
    A a;
    vector<A> va;
    va.push_back(a);//注意此句话
    return 0;
}

程序输出截图:

在没有va.push_back(a);这句话的时候,程序的输出只有两行构造器和析构器,加上这句话,多了拷贝构造和析构。所以容器第二个特点就是保存副本。注意是副本。貌似C++11 出了移动构造是解决这个问题的?我不太清楚。

特点3:内存托管

容器采用了内存的托管机制, 也就是说, 放入容器中的对象, 对象内存由容器来统一管理, 我们只需要使用容器即可。但如果托管的是指针, 容器只负责, 指针本身的内存大小, 而其指向的空间还要作单独处理 。

5、容器适用场景SWOT分析

VectorDequeListSetMultiSetMapMultiMap
内部结构dynamic arrayarray of arraysdouble linked listbinary treebinary treebinary treebinary tree
随机存取YesYesNoNoNoYes(key)No
搜索速度很慢
快速插入移除尾部首尾任何位置--------
Last modification:September 16th, 2019 at 07:09 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment

One comment

  1. 菜鸟

    正好最近在学这个