STL模板库

STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构

stl组件

容器(Container) - 管理某类对象的集合

迭代器(Iterator) - 在对象集合上进行遍历

算法(Algorithm) - 处理集合内的元素

容器适配器(container adaptor

函数对象(functor)

vector     为了使用vector,必须包含头文件<vector>

vector模拟动态数组

vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)

必须包含的头文件#include <vector>

vector支持随机存取

vector的大小(size)和容量(capacity

size返回实际元素个数

capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器

vec.begin()//指向迭代器中第一个元素。   
vec.end()//指向迭代器中末端元素的下一个,指向一个不存在元素。          
vec.push_back(elem)     //在尾部加入一个数据。  
vec.pop_back()          //删除最后一个数据。  
vec.capacity()  //vector可用空间的大小。  
vec.size()//返回容器中数据个数。  
vec.empty() //判断容器是否为空。  
vec.front()     //传回第一个数据。  
vec.back()  //传回最后一个数据,不检查这个数据是否存在。  
vec.at(index)   //传回索引idx所指的数据,如果idx越界,抛出out_of_range。  
vec.clear() //移除容器中所有数据。  
vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。  
vec.erase(begin,end)    //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator  
vec.insert(position,elem)   //在pos位置插入一个elem拷贝,传回新数据位置。  
vec.insert(position,n,elem) //在pos位置插入n个elem数据,无返回值。  
vec.insert(position,begin,end)  //在pos位置插入在[beg,end)区间的数据,无返回值。

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)尾部插入数字:vec.push_back(a);

(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。

(5)使用迭代器访问元素.

vector<int>::iterator it;

for(it=vec.begin();it!=vec.end();it++)

    cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:vec.size();

(9)清空:vec.clear();

map

使用平衡二叉树管理元素

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

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

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

不能直接改变元素的key,可以通过operator[]直接存取元素值

map中不允许key相同的元素,multimap允许key相同的元素

构造 拷贝 复制

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()

销毁所有元素并释放内存。

非变动性操作

c.size()

返回元素个数

c.empty()

判断容器是否为空

c.max_size()

返回元素最大可能数量

c1==c2

判断c1是否等于c2

c1!=c2

判断c1是否不等于c2

c1<c2

判断c1是否小于c2

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的元素区间

迭代器相关函数

begin()

返回一个双向迭代器,指向第一个元素

end()

返回一个双向迭代器,指向最后一个元素之后

rbegin()

返回一个逆向迭代器,指向逆向遍历的第一个元素

rend()

返回一个逆向迭代器,指向逆向遍历的最后一个元素

安插(insert)元素

c.insert(pos,e)

pos位置为起点插入e的副本,并返回新元素位置(插入速度取决于pos

c.insert(e)

插入e的副本,并返回新元素位置

c.insert(beg,end)

将区间[beg,end]内所有元素的副本插入到c

set

使用平衡二叉树管理元素

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

必须包含的头文件#include <set>

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

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

排序和查找

find

template<class InIt,class T>

InItfind(InItfirst, InItlast, const T& val);

返回区间 [first,last)中的迭代器i,使得*i== val

2) find_if

template<class InIt,class Pred>

InItfind_if(InItfirst, InItlast, Predpr);

返回区间 [first,last)中的迭代器i,使得pr(*i)== true

总结:

其中vector是一种定义新形势数组的方式,它的空间容量可以随时扩大,满足需要;

map是根据关键字进行快速排序查找,使用这些模板库有很多需要的功能,通过这些功能我们可以进行方便的计算,实现功能;

使用迭代器进行访问对象,所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。

所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素。

关联式容器必须定义出排序准则,默认情况是重载operator <

猜你喜欢

转载自blog.csdn.net/qq_20017379/article/details/80467623
今日推荐