STL学习总结

基础知识点:

|STLC++标准程序库的核心,深刻影响了标准程序库的整体结构;

|STL构成为可适应不同需求的集合类和在这些数据集合上操作的算法;

|STL内的所有组件有模板构成,其元素可以是任意类型;

|所有C++编译器和所有操作系统都支持STL

 

|STL组件为容器、迭代器、算法三部分构成;

容器为管理某类对象的集合;

迭代器为在对象集合(容器)上进行遍历;

算法为处理集合内的元素;

 

|容器类别:

序列式容器:排列次序取决于插入时机和位置;

关联式容器:排列顺序取决于特定准则;

 

STL容器的共同操作:

{

|初始化:

产生一个空容器:

std::list<int>l;

以另一个元素为初值完成初始化:

std::list<int>l;

...

std::vector<float>c(l.begin(),l.end());

以数组元素为初值完成初始化:

int array[]={2,4,6};

...

std::set<int>c(array,array+sizeof(array)/sizeof(array[0]));

 

|与大小相关的操作:

size():返回当前容器的元素数;

empty():判断容器是否为空;

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

 

|比较:

==!=<<=>>=

比较操作两端的容器必须属于同一类型;

如果俩个容器内的所有元素按序相等,那么这俩个容器相等;

采用字典式顺序判断某个容器是否小于另一个容器;

 

|赋值和交换:

swap用于提高赋值交换操作效率;

 

|与迭代器相关的操作:

begin():返回一个迭代器,指向一个元素;

end():返回一个迭代器,指向最后一个元素之后;

rbegin():返回一个逆向迭代器,指向逆向遍历的第一个元素;

rend():返回一个逆向迭代器,指向逆向遍历的最后一个元素之后;

 

|元素操作:

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

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

clear():移除所有元素;

}

 

迭代器:

{

|可遍历容器内全部或部分元素的对象;

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

 

|迭代器的基本操作:

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

++:将迭代器前进至下一元素;

==!=:判断俩个迭代器是否指向同一位置;

=:为迭代器赋值;

 

|所有容器都提供获得迭代器的函数;

半开区间[beg,end)的好处:

1、为遍历元素时循环的结束时机提供了简单的判断依据(只要为达到end()循环就可以继续);

2、不必对空区间采取特殊处理;

 

|所有容器都提供俩种迭代器

container::iterator以“读写”元素遍历元素;

container::const_iterator以“只读模式”遍历元素;

 

|迭代器分类:

双向迭代器:

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

listsetmap提供双向迭代器;

list<int>l;

for(pos=l.begin();pos!=l.end();++pos

{..}

|随机存取迭代器

除了具备双向迭代器的所有属性还具备随机访问能力;

可以对迭代器增加或者减少一个偏移量,处理迭代器之间的距离;

vectordequestring提供随机存取迭代器;

}

map/multimap

|构造拷贝析构:

map c:产生新的map;

map c1(c2):产生同类型的c1,并复制c2的所有元素;

map c(op):op为排序准则产生一个新的map;

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

map c[beg,end,op]:以op为排序准则,以区间[beg,end]中的元素产生一个map;

~map():销毁所有元素并释放内存;

 

|map可以为以下形式:

map<key,value>是一个以<为排序准则的map;

map<key,value,op>一个以op为排序准则的map;

 

|非变动操作:

c.size()返回元素的个数;

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

c.max_size()返回元素最大可能数量;

c1==c2判断二者是否相等;

c1!=c2判断二者是否不相等;

c1<c2判断是否小于;

c1>c2判断是否大于;

c1<=c2;c1>=c2;同上;

 

|赋值

c1=c2;c2的全部元素赋值给c1;

c1.swap(c2);c1c2的元素互换;

swap(c1,c2);同上,全局函数;

 

|特殊搜索操作:

count(key);返回键值等于key的元素个数;

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

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

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

equal_range(key)返回键值等于key的元素区间;

 

map实例:

#include <iostream>  

#include <map>  

#include <algorithm>  

using namespace std;  

struct T1  

{   

    int v;  

    bool operator <(const T1 &a)const  

    {  

        return (v <a.v);

    }  

};  

struct T2 

{ 

    int v;  

}; 

struct cmp 

{  

bool operator () (const T2 &a, const T2&b)const  

  {  

         return (a.v <b.v);  

   }  

};  

int main()  

{  

 map<T1,int>mt1;  

   map<T2, int,cmp>mt2;  

   map<string,int> m2;  

 map<string,int>::iterator m2i, p1, p2;  
    //map<string, int,greater<string> >m2;//greater<string>默认小大排序  
    //map<string, int,greater<string> >::iterator m2i, p1, p2;//迭代器  
    m2["abd"] =2;  
    m2["abc"] =1;  
    m2["cba"] =2;  
   m2.insert(make_pair("aaa", 9));  
    //make_pair 属于算法的内容,将两盒数组合成整体  
    m2["abf"] =4;  
    m2["abe"] =2;  
    cout <<m2["abc"] << endl;  
    m2i=m2.find("cba");  
    if(m2i != m2.end())  
    {  
        cout <<m2i->first << ": " <<m2i->second << endl;  
    }  
    else  
    {  
        cout <<"find nothing" << endl;  
    }  
    cout <<"Iterate" << endl;  
    for(m2i = m2.begin();m2i != m2.end(); m2i++)  

    {  
        cout <<m2i->first << ": " <<m2i->second << endl;  
    }  
    return 0;  

}  


multimap实例:

 

#include <iostream>  

#include <map>   

#include <algorithm>  

using namespace std;  

int main()  

{  
    multimap<string,int> mm1;  

    multimap<string,int>::iterator mm1i, p1, p2;  

   mm1.insert(make_pair("b", 3));  

   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;//b 的个数  

    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;  

    }  

    return 0;  

}  




学习心得:

STL具有高可重用性,高通用性,跨平台等优点,并且其内包含了些许多经典算法,适用于多种类型的数据,其为程序开发提供了许多宝贵的“零件”,方便了软件的开发,使得代码大大简化,功能强大并大幅度提升了效率,而不用耗费太多精力放在算法上,确实方便了编程操作。

其中迭代器将算法与容器联系起来,为容器中的元素分配储存空间,为算法执行期间产生的对象提供机制。

虽然上述部分,对于初学者而言 ,有些抽象,且难以理解,但相信通过丰富实践后,最后定能运用得行云流水,得心应手,对C++有更深刻地掌握。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值