C++入门-STL (Standard Template Library) 标准模板库

来源:互联网 发布:手机音乐制作软件 编辑:程序博客网 时间:2024/05/16 15:37
STL包含容器类(Container)、迭代子(Iterator)和算法(Algorithm)三个部分。
(1)、容器

(2)、算法
在模板中算法不依赖于具体的数据类型,而泛型算法更进一步不依赖于具体的容器。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。
泛型算法中采用函数对象(function object)引入不同情况下同一算法的差异。它没有使用继承和多态,避免了虚函数的开销,使STL效率更高。
泛型算法分类:
a、查找算法:有13种查找算法用各种策略去判断容器中是否存在一个指定值。equal_range()、lower_bound()和upper_bound()提供对半查找形式。
b、排序和通用整序算法:共有14种排序(sorting)和通用整序(ordering)算法,为容器中元素的排序提供各种处理方法。
所谓整序,是按一定规律分类,如分割(partition)算法把容器分为两组,一组由满足某条件的元素组成,另一组由不满足某条件的元素组成。
3、删除和代替算法:有15种删除和代替算法。
4、排列组合算法:有2种算法。
排列组合是指全排列。如:三个字符{a,b,c}组成的序列有6种可能的全排列:abc,acb,bac,bca,cab,cba;并且六种全排列按以上顺序排列,认为abc最小,cba最大,因为abc是全顺序(从小到大)而cba是全逆序(从大到小)。
5、生成和改变算法:有6种,包含生成(generate),填充(fill)等等。
6、关系算法:有7种关系算法,为比较两个容器提供了各种策略,包括相等(equal()),最大(max()),最小(min())等等。
7、集合算法:4种集合(set)算法提供了对任何容器类型的通用集合操作。包括并(union),交(intersection),差(difference)和对称差(symmetric difference)。
8、堆算法:有4种堆算法。堆是以数组来表示二叉树的一种形式。标准库提供大根堆(max_heap),它的每个结点的关键字大于其子结点的关键字。
9、算术算法:该类算法有4种,使用时要求包含头文件<numeric>。
(3)、迭代器(Iterator)检查容器内元素并遍历元素的数据类型。
迭代器分类:
  1.输入迭代器(input iterator),只能单步向前迭代元素,不允许修改由该类迭代器引用的元素。
  2.输出迭代器(output iterator),该类迭代器和Input Iterator极其相似,也只能单步向前迭代元素,不同的是该类迭代器对元素只有写的权力。
    3.前向迭代器(forward iterator),该类迭代器可以在一个正确的区间中进行读写操作,它拥有Input Iterator的所有特性,和Output Iterator的部分特性,以及单步向前迭代元素的能力。
    4.双向迭代器(bidirectional iterator),该类迭代器是在Forward Iterator的基础上提供了单步向后迭代元素的能力。
    5. 随机存取迭代器(random access iterator),该类迭代器能完成上面所有迭代器的工作,它自己独有的特性就是可以像指针那样进行算术计算,而不是仅仅只有单步向前或向后迭代。
容器迭代器:
每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter;
begin和end操作:
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回的迭代器指向第一个元素:
vector<int>::iterator iter = ivec.begin();
上述语句把iter初始化为由名为begin的vector操作返回的值。假设vector不空,初始化后,iter即指该元素为ivec[0]。
 vector 和deque提供的是RandomAccessIterator,list提供的是BidirectionalIterator,set和map提供的 iterators是 ForwardIterator
容器                 支持的迭代器类别           
vector              随机访问       
list                   双向              
set                   双向     
multiset            双向   
map                 双向                   
multimap          双向           
deque              随机访问
stack                不支持    
quequ               不支持
priority_queue   不支持

vector<int> ivec(10,1);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
     cout << *iter <<endl; //使用 * 访问迭代器所指向的元素
      *iter = 0 //赋值为0
}
eg:
#include <string>#include <vector>#include <set>#include <deque>
vector
//定义一个集合vector<double> v(0);//给集合赋值int i = 0;for (i = 0; i<10;i++){v.push_back(i);}//显示集合中的元素for (i = 0;i < v.size(); i++) {cout<<v[i]<<",";}cout<<endl;//迭代器遍历vector<double>::iterator iterator;for (iterator = v.begin(); iterator != v.end(); iterator++){cout<< *iterator <<",";}cout<<endl;

set
集合(set)是一个容器,它其中所包含的元素的值是唯一的。并且集 合中的元素按一定的顺序排列。
//定义一个setset<string> s;s.insert("apple");s.insert("orange");s.insert("banana");set<string>::iterator iter;for (iter = s.begin(); iter != s.end(); iter++){cout<<*iter<<",";}cout<<endl;
输出:apple,banana,orange,

deque
//定义一个双向队列deque<string> deq;deq.push_back("hell");//尾部插入deq.push_back("fill");deq.push_front("dell");//头部插入deque<string>::iterator pos;pos = deq.begin();pos ++;deq.insert(pos,"kill");  //位置插入cout<<deq.front()<<endl;cout<<deq.back()<<endl;

0 0
原创粉丝点击