C++标准模板库(STL)的简单知识点

一.STL简介

1.简介

STL<标准模板库>是通用类模板和算法的集合,他提供给程序员一些标准的数据结构的实现。

2.三类数据结构 

1.顺序性容器

vector 从后面快速的插入与删除,直接访问任何元素

deque 从前面或后面快速的插入与删除,直接访问任何元素

list 双链表,从任何地方快速插入与删除

2.关联容器

set 快速查找,不允许重复值

multiset 快速查找,允许重复值

map 一对多映射,基于关键字快速查找,不允许重复值

multimap 一对多映射,基于关键字快速查找,允许重复值

3.容器适配器

stack 后进先出

queue 先进先出

priority_queue 最高优先级元素总是第一个出列 

二.顺序性容器

1.C++ Vector(向量容器)

1).特点

1.看作动态数组,指定一块如同数组一样的连续存储,但空间可以动态扩展

2.随机访问方便

3.连续存储节省空间

4.内部插入、删除效率低下,只能在后端进行追加和删除

5.动态添加的数据超过vector默认分配的大小进行内存重新分配、拷贝和释放,操作非常消耗性能

2)语法

1. Constructors 构造函数

vector<int> v1; //构造一个空的vector

vector<int> v1( 5, 42 ); //构造了一个包含5个值为42的元素的Vector 

2.at() 返回指定位置的元素

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

3.empty() 判断Vector是否为空(返回true时为空)

4. pop_back() 移除最后一个元素 

5.push_back() 在Vector最后添加一个元素 

2.C++ List (双向链表)

1)特点

1.不使用连续的内存空间,随意进行动态操作

2.任何位置快速进行插入和删除

3.不能进行内部的随机访问,不支持[ ]操作符和vector.at()<返回指定位置的元素>;

2)语法

1.assign() 给list赋值

void assign( input_iterator start, input_iterator end ); //以迭代器start和end指示的范围为list赋值

void assign( size_type num, const TYPE &val ); //赋值num个以val为值的元素。 2.back() 返回最后一个元素的

2. erase() 删除一个元素 

iterator erase( iterator loc );//删除loc处的元素

iterator erase( iterator start, iterator end ); //删除start和end之间的元素 

3.insert() 插入一个元素到list中 

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

void insert( iterator loc, size_type num, const TYPE &val );  //定位置loc前插入num个值为val的元素

void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入区间[start, end)的所有元素

4.splice()  合并两个list 

void splice( iterator pos, list &lst );//把lst连接到pos的位置

void splice( iterator pos, list &lst, iterator del );//插入lst中del所指元素到现链表的pos上

void splice( iterator pos, list &lst, iterator start, iterator end );//用start和end指定范围。

3.C++ Deque(双向队列)

1)特点

1.随机访问方便,支持[]操作符和vector.at(),性能没有vector好

2.可以在两端进行插入和删除操作,但性能不及list

3.可以在两端进行push、pop

4.相对于vector占用更多的内存。双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一 样)。 

2)语法

1.1.Constructors 创建一个新双向队列

deque();//创建一个空双向队列

deque( size_type size );// 创建一个大小为size的双向队列

deque( size_type num, const TYPE &val ); //放置num个val的拷贝到队列中

deque( const deque &from );// 从from创建一个内容一样的双向队列

deque( input_iterator start, input_iterator end ); // start 和 end - 创建一个队列,保存从start到end的元素。 

4.三者比较

1.vector 是一段连续的内存块,而deque 是多个连续的内存块, list 是所有 数据元素分开保存,可以是任何两个元素没有连续。  据元素分开保存,可以是任何两个元素没有连续。  

2.vector 的查询性能最好,并且在末端增加数据也很好,除非它重新申请内存 段;适合高效地随机存储。  

3.list 是一个链表,任何一个元素都可以是不连续的,但它都有两个指向上一 元素和下一元素的指针。所以它对插入、删除元素性能是最好的,而查询性能非 常差;适合大量地插入和删除操作而不关心随机存取的需求。  

4.deque 是介于两者之间,它兼顾了数组和链表的优点,它是分块的链表和多 个数组的联合。所以它有被list好的查询性能,有被vector好的插入、删除性能。 如果你需要随即存取又关心两端数据的插入和删除,那么deque是最佳之选。 

三.关联容器

1.特点

1.内部实现是采用非线性的二叉树结构,即红黑树的结构原理

2.元素是有序的集合,默认在插入的时候按升序排列

2.Sets  &MultiSets

1)特点

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

2多元集合(MultiSets)支持重复对象

2)语法

1.count()  返回某个值元素的个数

2.equal_range()   返回第一个>=关键字的迭代器和>关键字的迭代器

pair<iterator,iterator>equal_range(const key_type &key ); //key是用于排序的关键字

Set<int> ctr;

例如:

Pair<set<int>::iterator,set<int>::iterarot>p;

For(i=0;i<=5;i++) ctr.insert(i);

P=ctr.equal_range(2);

那么*p.first==2;*p.second==3;  

3.find() 返回一个指向被查找到元素的迭代器

iterator find( const key_type &key );

//查找等于key值的元素,并返回指向该元素的迭代器;

//如果没有找到,返回指向集合最后一个元素的迭代器 

3.Maps & MultiMaps

1.特点

1.Maps  关联式容器,包含“关键字/值”对

2.MultiMaps 允许重复的元素

2.语法

1.count() 返回指定元素出现的次数

size_type count( const KEY_TYPE &key ); //返回map中键值等于key的元素的个数

2.equal_range() 返回特殊条目的迭代器对

pair equal_range( const KEY_TYPE &key );

//返回两个迭代器,指向第一个键值为key的元素和指向最后一个键值为key的元素 

四.容器适配器

1.特点

1.STL适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用另一种顺序容器去实现,即“它保存一个容器,这个容器再保存所有元素”。

2.默认stack和queue基于deque容器实现;priority_queue基于vector容器实现;创建适配器时在第二个参数上指定具体的顺序容器可以覆盖适配器的默认实现。

3.stack特点是后进先出,它关联的基本容器可以是任何一种顺序容器

4.queue的特点是先进先去,适配器要求其关联的基础容器提供pop_front操作,因此其不能建立在vector容器上。

2.Stacks(堆栈)

1.pop() 移除栈顶元素

2.push() 在栈顶增加元素

3.size() 返回栈中元素数

3.Queues(队列)

1..back() 返回一个引用,指向最后一个元素 

2.pop() 删除第一个元素

3.push() 在末尾加入一个元素

4.Priority Queues(优先队列)

1.特点

类似队列,但是元素按照一定的断言排列有序

2.语法

1.top() 返回优先队列中有最高优先级的元素 

五.迭代器

1.解释

   迭代器是一种对象,用来遍历STL容器中的部分或全部元素,每个迭代器对象代表容器中确定的地址。迭代器修改了常规指针的接口。迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器,迭代器可以把抽象容易和通用算法有机地结合起来。

     迭代器用于遍历复杂数据结构,其下层运行机制取决于其所遍历的数据结构,因此,每一种容器型别都必须提供自己的迭代器,事实上每一种零七都将其迭代器以嵌套的形式定义于内部。各种迭代器接口相同,型别却不同。即泛型程序设计的概念:所有操作行为都使用相同的接口,虽然他们的型别不同。

2.功能特点

迭代器使开发人员不必整个实现类接口。只需提供一个迭代器,即可遍历类中的数据结构,可被用来访问一个容器类的所包含的全部元素。

//对vector容器对象生成和使用迭代器
vector<int>the_vector;
vector<int>::iterator the_iterator;
for(int i=0;i<10;i++)
    the_vector:push_back(i);
int total=0;
the_iterator=the_vector.begin();
while(the_iterator!=the_vector.end())
{
    total += *the_vector;
    the_iterator++;
}

cout<<"Total="<<total<<endl;
//提示:对一个迭代器的解引用操作(*),可以访问到容器所包含的元素

注:本文语法中只包含有易错及难点,常见简单的语法并未包含在内,不代表没有。

猜你喜欢

转载自blog.csdn.net/humeApz/article/details/81215663