C++STL标准模板库

标准模板库STL

STLStandard Template Library,标准模板库)以模板为基础,所以能用于任何数据结构和结构。

顺序容器:组织成对象的有限线性集合,所有对象都是同一类型。

vector(向量)、list(线性表)、deque(双端队列)

 

关联容器:提供了基于关键字(Key)快速检索数据的能力。

set(集合)、multiset(多元集合)、map(映射)、multimap(多元映射)

setmap支持唯一关键词(unique key),就是对每个Key,最多只保存一个元素(数据记录)。

multisetmultimap则支持相同关键词(equal key),这样可有多个元素用同一个Key进行存储。

setmultiset)和mapmultimap)之间的区别在于setmultiset)中的存储数据内含了Key表达式;而mapmultimap)则将Key表达式和对应的数据分开存放。

 

vector向量

单向开口的连续线性空间;

提供对序列的快速随机访问(也称直接访问,下标法);

动态结构,大小不固定,可以在程序运行时增加或减少;

时间复杂度

1.访问任意元素或从末尾添加元素:常量级时间复杂度;

2.查找特定值的元素所在的位置或在vector中插入元素、删除元素:线性时间复杂度。(需要进行元素的移动)

3.具有自动分配内存、自动存储管理功能。

访问和遍历

1.向量类似于数组,向量类模板中对下标运算符[]”进行了重载;

2.成员函数at()也可以访问向量中指定位置的元素,且at()保证不去访问向量内越界的元素(越界抛出异常out_of_range

注:两个向量如果具有相同的容量并且所有相同位置的元素相等,则两个向量被认为是相等的。

 

pop_back();  //移除最后一个元素。

push_back();  //vector最后添加一个元素。

size_type size();  //返回当前vector所容纳的元素数目。

size_type capacity();  //返回当前vector所得内存能容纳的元素数量(不增加内存)。

size_type max_size();  //返回当前vector所能容纳元素数量的最大值(包括可重新分配内存)。

bool empty();  //返回当前vector是否为空,若为空,返回true

iterator insert(iterator loc,const TYPE &val);  //指定位置loc前插入值为val的元素,返回指向这个元素的迭代器

iterator erase(iterator loc);  //删除指定位置loc的元素,返回值是指向删除元素的下一个位置的迭代器

void resize(size_type size,TYPE val);  //改变当前vector的大小为size,且对新创建的元素赋值val

 

list双向链表

1.提供两个指针域,可以向前访问,也可以向后访问(双向迭代器),但不能随机访问(没有[]运算符的重载);

2.list中的元素是在堆中存放的,内存空间可以不连续;

3.插入删除效率都很高(常量级时间复杂度)。

4.插入(insert)和合并(splice)都不会造成原有的list迭代器失效。

 

pop_back();  //删除最后一个元素。

pop_front();  //删除第一个元素。

push_back();  //list的末尾添加一个元素。

push_front();  //list的头部添加一个元素。

sort();  //list排序,默认升序。

void remove(const TYPE &val);  //删除链表中所有值为val的元素。

void remove_if(UnPred pr);  //以一元谓词pr来判断元素的依据,遍历整个链表,如果pr返回true,则删除该元素。

void merge(list &lst);  //将当前链表和参数lst指定的链表归并成一个整齐排列的组合链表,默认的归并方式为升序。操作前需要对两个序列进行升序排序,否则将lst的元素插入到大于其元素的当前链表的元素前面。

void splice(iterator pos,list &lst);  //把参数lst指定的链表连接到当前链表中pos的位置。

 

deque双端队列

1.双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作,时间复杂度均为常数时间。

2.按页(或块)来分配存储器,每页包含固定数目的元素,页和页之间用指针相链接,随时可以增加一段新的空间并链接起来。

3.支持随机存取,即它支持[ ]”运算符。

4.deque容器的中间进行inserterase操作效率比较低。

 

pop_back();  //删除尾部的元素。

pop_front();  //删除头部的元素。

push_back();  //在尾部加入一个元素。

push_front();  //在头部加入一个元素。

 

setmultiset

1.set容器中所包含的元素的值是唯一的。

2.标准的STL set是以RB-tree作为底层实现机制RB-tree是一种平衡二叉搜索树。

3.set中的元素按一定的顺序排列,若set容器中元素类型为intdoublestring等,则会自动进行(默认为升序)排序(使用平衡二叉树来实现),若set容器中元素使用自定义类型而未重载关系运算符“<”就不能自动排序。

4.set容器不支持随机访问

5.对于set类的关联容器,使用其自身提供的成员函数find()来搜索元素,会比使用STL的算法find()更有效率(因为STL算法find()采用的是顺序查找)。

注:不要通过set的迭代器改变set的相应元素值,因为set元素值就是其键值,关系到set元素的排列规则。会严重破坏set的组织。在STL标准中,set<T>::iterator被定义为底层RB-treeconst_iterator,拒绝写入操作。

 

set<T> iset(a,a+n);  //将数组a的元素插入集合中,n表示数组a中元素数量

count();  //返回当前集合中出现的某个值的元素的数目

end();  //返回指向当前集合中最后一个元素的迭代器。

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

erase();  //删除指定的元素。

find();  //在当前集合中查找等于key值的元素,并返回指向该元素的迭代器;如果没有找到,返回指向集合最后一个元素的迭代器

insert();  //在当前集合中插入指定的元素(应该注意的是在集合中不能插入两个相同的元素)。

lower_bound();  //返回一个指向大于或等于key值的第一个元素的迭代器。

upper_bound();  //在当前集合中返回一个指向大于Key的元素迭代器。

max_size();  //返回当前集合能容纳元素的最大限值

size();  //返回当前集合中元素的数目

 

mapmultimap

标准的STL map也是以RB-tree作为底层实现机制的,所以在map内部所有的元素都是有序的。

它提供一对一(key/value)的数据处理能力,其中第一个key可以称为关键字,每个关键字只能在map中出现一次,第二个value可以称为该关键字的值。例如:map<int, string> imap;

1.map容器可以通过关键字key访问其中的元素(imap[1001])。如果存在以key为关键词的结点,则会返回这个结点对应的实值,如果此时进行=”运算符的赋值操作,则会出现原来结点被新节点覆盖的危险;如果在map中并不存在关键字为key的节点,则会直接向map插入以key为关键字的结点,并返回这个结点,这时可以对其进行赋值操作。

2.map中的元素是以“关键字/值”的匹配对,通常采用pair型数据表示,例如:

imap.insert( pair<int,string>(1001, ”zhangsan”) );

插入数据的方式:

1.insert函数插入pair数据:

imap.insert( pair<int,string>(1001, ”zhangsan”) );

2.insert函数插入value_type数据:

imap.insert( map<int,string>::value_type(1002,”lisi”) );

3.用数组方式插入数据:

imap[1003] = ”wangwu”;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值