在前面的几篇中,已经将C++的特性基本都提到了,今天主要说说C++ STL编程,何为STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。下面我们就具体说说什么是STL吧。
STL概述:组件、容器、迭代器、算法。
STL是C++标准程序库的核心;
STL是泛型程序库;
STL由一些可适应不同需求的集合类,以及在这些数据集合上操作的算法构成;
STL内的所有组件都是由模板构成,其元素可以是任意类型;
STL是所有C++编译器和所有操作系统平台都支持的一种库。
模板:在前面的文章中说过如何定义一个模板函数,现在我们先试着针对一个或多个尚未明确的类型定义类和函数。
<span style="font-family:Times New Roman;font-size:14px;">#include <iostream> using namespace std; template <typename T> class TempClass { private: T value; public: TempClass(T t) { value=t; } T GetValue() { return value; } void SetValue(T t) { value=t; } }; int main() { TempClass<char> ch('A'); cout<<ch.GetValue()<<endl; ch.SetValue('B'); cout<<ch.GetValue()<<endl; TempClass<double> d(5.5); cout<<d.GetValue()<<endl; d.SetValue(6.6); cout<<d.GetValue()<<endl; return 0; } </span>
STL组件:容器(管理某类对象的集合)、迭代器(在对象集合上进行遍历)、算法(处理集合内的元素)STL容器的共通能力:所有的容器存放的都是值而非引用;所有元素都形成一个次序,可以按相同的次序一次或多次遍历元素。
STL容器元素的条件:必须能够通过拷贝构造函数进行赋值;必须可以通过赋值运算完成复制操作;必须可以通过析构函数完成销毁动作......
STL容器的共同操作:
初始化:1.产生一个空的容器;2.以另一个容器元素为初值完成初始化;3.以数组元素为初值完成初始化
与大小相关的操作:1.size();2.empty()3.max_size()
比较:==、!=、<、<=、>、>= 比较操作两端的容器必须属于同一类型;如果两个容器内所有的元素按序相等,那么这两个容器相等;采用字典式顺序判断两个容器大小
赋值(assignment)和交换(swap):swap提高赋值的操作效率
与迭代器相关的操作:
begin()返回一个迭代器,指向第一个元素;
end()返回一个迭代器,指向最后一个元素;
rbegin()返回一个逆向迭代器,指向逆向遍历的第一个元素;
rend()返回一个逆向迭代器,指向逆向遍历的最后一个元素;
元素操作:
insert(pos,e)将元素e拷贝安插于迭代器pos所指的位置;
erase(beg,end)移除[beg,end]区间内所有的元素;
clear()移除所有元素;
迭代器(iterator):
可以遍历STL容器内全部或部分元素的对象;指出容器中的一个特定位置;迭代器的基本操作;
*:返回当前位置上的元素值。如果该元素上有成员,可以通过迭代器以operator->取用
++:将迭代器前进至下一个元素
==和!=:判断两个迭代器是否指向同一位置
=:为迭代器赋值
iterator迭代器和const_iterator迭代器,顾名思义
STL容器:
常见容器:vector、deque、list、map/multimap、set
特殊容器:stack、queue、priority_queue
其他容器:hashtable
vector容器:vector模拟动态数组。以下代码列出了vector的常见操作
<pre name="code" class="cpp"><span style="font-size:14px;">#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { //创建一个空的vector容器 vector<int> v; //向容器末尾追加值 v.push_back(1); //定义一个迭代器 vector<int>::iterator i = v.begin(); //显示第一个元素 cout<<"第一个元素为:"<<v.front()<<endl; cout<<"第一个元素为:"<<v[0]<<endl; cout<<"第一个元素为:"<<*i<<endl; //在第二个位置插入一个元素 v.push_back(2); i=v.begin(); v.insert(++i,3); //迭代Vector cout<<"遍历vector:"; for(i=v.begin();i!=v.end();i++) { cout<<*i<<","; } cout<<endl; //移除最后一个元素 v.pop_back(); cout<<"pop_back移除后vector的大小为:"<<v.size()<<endl; //移除第一个元素 i=v.begin(); v.erase(i); cout<<"erase移除后vector的大小为:"<<v.size()<<endl; //清空vector v.clear(); cout<<"清空后vector的大小为:"<<v.size()<<endl; return 0; }</span>
deque容器:deque和vector一样,采用线性表,与vector唯一不同的是,deque采用的分块的线性存储结构,每块大小一般为512字节,称为一个deque块,所有的deque块使用一个Map块进行管理,每个map数据项记录各个deque块的首地址,这样以来,deque块在头部和尾部都可已插入和删除元素,而不需要移动其它元素。
list容器:使用双向链表管理元素;不支持随机存取,因此不提供下标操作符;在任何位置上执行元素的安插和移除都非常快;安插和删除不会导致指向其他元素的指针、引用、iterator失效。
#include <iostream> #include <list> #include <iterator> using namespace std; int main() { //创建一个空的list容器 list<int> l; //向容器末尾追加值 l.push_back(1); //定义一个迭代器 list<int>::iterator i = l.begin(); //显示第一个元素 cout<<"第一个元素为:"<<l.front()<<endl; cout<<"第一个元素为:"<<*i<<endl; //在第二个位置插入一个元素 l.push_back(2); l.insert(++i,3); //在首位插入元素 l.push_front(4); //迭代list cout<<"遍历list:"; for(i=l.begin();i!=l.end();i++) { cout<<*i<<","; } cout<<endl; //移除最后一个元素 l.pop_back(); cout<<"pop_back移除后list的大小为:"<<l.size()<<endl; //删除第二个元素 i=l.begin(); l.erase(++i); cout<<"erase移除后list的大小为:"<<l.size()<<endl; //移除第一个元素 l.pop_front(); cout<<"pop_front移除后list的大小为:"<<l.size()<<endl; //清空list l.clear(); cout<<"清空后list的大小为:"<<l.size()<<endl; return 0; }
map/multimap:使用平衡二叉树管理;key-value存储;根据key自动排序;不能直接改变key,可以通过operator[]直接存取元素值;map中key唯一,multimap中key值不唯一。
#include <iostream> #include <map> #include <iterator> #include <string> using namespace std; int main() { map<int,string> m; //向map中插入元素 m.insert(pair<int,string>(1, "qqq")); m.insert(map<int,string>::value_type(2,"www")); m[3]="eee"; map<int,string>::iterator i = m.begin(); //迭代map for(i=m.begin();i!=m.end();i++) { cout<<i->first<<":"<<i->second<<endl; } //元素个数 cout<<"map中元素个数为:"<<m.size()<<endl; //根据key找元素 i=m.find(1); cout<<"1对应的值为:"<<i->second<<endl; //根据迭代器指针移除 m.erase(i); cout<<"iterator移除后大小是:"<<m.size()<<endl; //根据key来移除 m.erase(2); cout<<"www移除后大小是:"<<m.size()<<endl; //清空map m.clear(); cout<<"clear移除后大小是:"<<m.size()<<endl; return 0; }
还有其他一些容器,此处不再一一说明。
STL算法:搜寻、排序、拷贝、数值运算
STL提供了一些标准算法来处理容器内的元素(搜寻、排序、拷贝、数值运算);STL的算法是全局函数;
本文主要介绍STL几大容器以及迭代器的具体操作,关于更多STL的操作,请点击这里下载ppt教程。