关于STL的学习总结

 一,基础知识

    1,STL是什么    

        由一些可以适应不同需求的集合类,以及在这些数据集合上操作的算法构成。

    2,STL的作用    

        对数据更加快捷方便地进行操作。

    3,   STL的组成

        1》容器-管理某类对象的集合,(看做是一个不指定内部元素数据类型的大类)

        2》迭代器-在对象集合上进行遍历(看做是一个位置指针,+1,-1,分别指上一个或者下一个容器内的元素)

        3》算法-处理集合内的对象(相当于大类内的函数,可对数据进行各种操作)

        4》容器适配器,函数对象(I don't know..)

    4,迭代器

        1》作用:

            遍历STL容器内全部或部分元素的对象

            指出容器中的一个特定位置

        2》基本操作:

            1-   *  返回当前位置上的元素值,如果该元素有成员,可以通过迭代器以operator ->取用。

            2-   ++  将迭代器前进到下一元素

            3-   ==    和  !=  判断两个迭代器是否属于同一位置

            4-  =  为迭代器赋值(将所指元素的位置赋值过去)

        3》两种迭代器:

             1-container::interator以  读/写  的模式遍历元素

             2-container::const_iterator以  只读  模式遍历元素

        4》迭代器分类

            1-双向迭代器

                可以双向行进,以递增运算前进或以递减运算后退,可以用==和!=比较。

                list, srt, map, 提供双向迭代器

            (有单项迭代器吗?  答,有,指向forward_list的迭代器只支持++i,i++,其他的像+=,+,- -,等  都不支持。

            2-随机存储迭代器

                除具有双向迭代器的所有属性外,还具有随机访问的能力。

                可以对迭代器增加或者减少一个偏移量,处理迭代器之间的距离或者使用<  > 之类的关系运算符比较两个迭代器。

                vector,deque 和string 提供随机存储迭代器

    5,vector

          1》简介

                1-模拟动态数组(看成一个变态的大数组类)

                2-元素可以是任意类型

                3-包含的头文件#include <vector>

           ps:内部元素必须具备赋值和拷贝能力。

          2》变态数组vector的构造,拷贝和析构

                1- vector<T>c  : 产生空的vector

                2- vector<T>c1(c2) :产生同类型的c1,并将复制c2的所有元素

                3- vector<T>c(n) : 利用类型T的默认构造函数和拷贝构造函数生成一个大小为n的vector

                4- vector<T>c(n,e) : 产生一个大小为n的vector,每个元素都是e

                5- vector<T>c(beg,end) : 产生一个vector,以区间[beg,end]为元素初值

                6- ~vector<T>()  :  销毁所有元素并释放内存。

          3》其他操作:

                1-c.empty()   判断容器是否为空

                2- c.capacity()   返回重新分配空间前可容纳的最大元素数量


                3- c.reserve(n)   扩大容量为n

                4-  c1= c2  将c2的全部元素赋值给c1    

                5-  c.assign(beg,e[beg,end]nd)  将区间的元素赋值给c   

                6- at(idx) 返回索引idx所标识的元素的引用,进行越界检查

                7- operator[](idx) 返回索引idx所标识的元素的引用,不进行越界检查

                8- front() 返回第一个元素的引用,不检查元素是否存在

                9- back() 返回最后一个元素的引用,不检查元素是否存在

                10- c.push_back(e) 在尾部添加一个元素e的副本

               11- c.pop_back() 移除最后一个元素但不返回最后一个元素

    6,map/multimap

        1》简介

            1- 元素包含两部分(key,value),key和value可以是任意类型

            2- 必须包含的头文件#include <map>

            3- 根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢

            4- 不能直接改变元素的key,可以通过operator[]直接存取元素值
            5- map中不允许key相同的元素,multimap允许key相同的元素

        2》构造,拷贝和析构

            1- map c    产生空的map

            2- mapc1(c2)    产生同类型的c1,并复制c2的所有元素

            3- mapc(op)    以op为排序准则产生一个空的map

            4- map c(beg,end)     以区间[beg,end]内的元素产生一个map

            5- map c(beg,end,op)    以op为排序准则,以区间[beg,end]内的元素产生一个map

            6- ~ map()     销毁所有元素并释放内存。

        3》搜寻操作:

            1- count(key)    返回”键值等于key”的元素个数

            2- find(key)    返回”键值等于key”的第一个元素,找不到返回end

            3- lower_bound(key)    返回”键值大于等于key”的第一个元素

            4- upper_bound(key)    返回”键值大于key”的第一个元素

            5- equal_range(key)    返回”键值等于key”的元素区间

    7,set/multiset

        1》简介:

            1- 集合(Set)是一种包含已排序对象的关联容器

            2- 包含的头文件#include <set>

            3- map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。

            4- set中不允许key相同的元素,multiset允许key相同的元素

       2》其他操作:

            1- equal_range()    返回集合中与给定值相等的上下限的两个迭代器

            2- lower_bound()    返回指向大于(或等于)某值的第一个元素的迭代器

            3- key_comp()    返回一个用于元素间值比较的函数

            4- upper_bonund()    返回大于某个值元素的迭代器

            5- value_comp()    返回一个用于比较元素间的值的函数

    8,pair模板

            用于生成key-value

    9,通用算法

        1》元素操作:

            1-erase(beg,end)-移除[beg,end]区间内的所有元素

            2-clear()-移除所有元素

            3-insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置

        2》与大小相关:

            1- size()-返回当前容器的元素数量

            2- empty()-判断容器是否为空

            3- max_size()-返回容器能容纳的最大元素数量

        3》与迭代器相关的:

            1- begin()-返回一个迭代器,指向第一个元素

            2- end()-返回一个迭代器,指向最后一个元素之后
            3- rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素
            4- rend()-返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
        4》赋值:
            1- swap用于提高赋值操作效率
        5》与比较相关的:
            1- ==,!=,<,<=,>,>=
            2- 比较操作两端的容器必须属于同一类型
            3- 如果两个容器内的所有元素按序相等,那么这两个容器相等
            4- 采用字典式顺序判断某个容器是否小于另一个容器
        6》

二,简单应用

    1,迭代器

list<int> l; 
for(pos=l.begin();pos!=l.end();++pos
{
    …
}

或:

vector<int> v; 
for(pos=v.begin();pos<v.end();++pos{
	…
 }

    2,vector

vector<int> a;//定义一个元素类型为int,名称为a 的动态数组。
    for (int i = 0; i < 5; ++i){
        a.push_back(5 - i);//将5 4 3 2 1 依次放入a 里面
    }
    cout << "Size: " << a.size() << endl; //a当前的大小
    a.pop_back(); //移除a 的最后一个元素
    a[0] = 1;

    cout << "Size: " << a.size() << endl;
    for (int i = 0; i < (int)a.size(); ++i){
        cout << a[i] << ", " << endl;
    }
    cout << endl;

    sort(a.begin(), a.end());
    cout << "Size: " << a.size() << endl;
    for (int i = 0; i < (int)a.size(); ++i){
        cout << a[i] << ", " << endl;
    }
    cout << endl;

    a.clear();//清除a中所有元素
    cout << "Size: " << a.size() << endl;

    3,map/multimap

multimap<string, int> mm1;//定义一个索引key是string,值valua是int的,名为mm1的
multimap<string, int>::iterator mm1i, p1, p2;//定义p1,p2两个迭代器
mm1.insert(make_pair("b", 3));//make_pair,生成
mm1.insert(make_pair("a", 0));
mm1.insert(make_pair("b", 5));
mm1.insert(make_pair("c", 4));
mm1.insert(make_pair("b", 2));
cout << "Size: " << mm1.size() << endl;
for(mm1i = mm1.begin(); mm1i != mm1.end(); mm1i++)
{   cout << mm1i->first << ": " << mm1i->second << endl; }
    cout << "COUNT: " << mm1.count("b") << endl;
    cout << "Bound: " << endl;
    p1 = mm1.lower_bound("b");
    p2 = mm1.upper_bound("b");
    for(mm1i = p1; mm1i != p2; mm1i++){
    cout << mm1i->first << ": " << mm1i->second << endl;
}

三,学习感悟

    一开始预习时没看到实例,一直看不明白,找教程找博客,不是太入门就是太复杂,讲了几个例子后,慢慢的就明白是个什么意思了。现在也刚能明白,这东西有多好用,后面还有一堆容器自带的函数,还要再记,再用,争取掌握吧。  



猜你喜欢

转载自blog.csdn.net/sodacoco/article/details/80435730