STL(StandardTemplate Library )简介
STL:C++ 程序设计语言的标准模板库。 STL以模板类和模板函数的形式为程序员提供了各种数据结构和算法的精巧实现,程序员如果能够充分地利用STL,可以在代码空间、执行时间和编码效率上获得极大的好处。
STL的主要组成
•容器(Container):可容纳各种数据类型的数据结构。如vector(向量,类似于数组)、list(列表,类似于链表)等,通过模板的参数可以指定容器中的元素类型。
•迭代器(iterator):可依次存取容器中的元素。
•算法(algorithm):用来操作容器中的元素的函数模板,如sort可以对vector中的数据排序,find搜索list中的数据。
三者的关系:
迭代器是对C 中的指针的一般化,用来将算法和容器联系起来。几乎所有的STL 算法都是通过迭代器来存取元素序列进行工作的,而STL 中的每一个容器也都定义了其本身所专有的迭代器,用以存取容器中的元素。
STL的主要组成
•容器(Container):可容纳各种数据类型的数据结构。如vector(向量,类似于数组)、list(列表,类似于链表)等,通过模板的参数可以指定容器中的元素类型。
•迭代器(iterator):可依次存取容器中的元素。
•算法(algorithm):用来操作容器中的元素的函数模板,如sort可以对vector中的数据排序,find搜索list中的数据。
三者的关系:
迭代器是对C 中的指针的一般化,用来将算法和容器联系起来。几乎所有的STL 算法都是通过迭代器来存取元素序列进行工作的,而STL 中的每一个容器也都定义了其本身所专有的迭代器,用以存取容器中的元素。
STL中的容器
•
顺序容器:元素的位置与元素的值无关
vector: 向量
内部实现:数组,初始分配一定容量,当不够用时,会自动扩充容量进行重新配置
适合的运算:随机访问([i],at(i)),后部插入/删除效率高
deque(double-endedqueue): 双端数组
内部实现:一段一段的定量连续空间构成
适合的运算:随机访问,前/后部插入/删除效率高
list: 双向链表
内部实现:双链表
适合的运算:任意位置插入/删除
•
关联容器
•
容器
适配器
下卖弄测试各个容器的功能如何
//测试vector容器的功能
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1; //vec1对象初始为空
vector<int> vec2(10,6); //vec2对象有10个值为6的元素
vector<int> vec3(vec2.begin(),vec2.begin()+3);
//vec3对象最初有3个值为6的元素,拷贝构造
vector<int>::iterator i; //声明一个名为i的双向迭代器
//从前向后显示vec1中的数据
for (i =vec1.begin(); i !=vec1.end(); ++i)
cout << *i << " ";
cout << endl;
vec1.push_back(2);//从后面添加一个成员
vec1.push_back(4);
vec1.insert(vec1.begin()+1,5);//在vec1第一个位置上插入成员5
//从vec1第一的位置开始插入vec3的所有成员
vec1.insert(vec1.begin()+1,vec3.begin(),vec3.end());
vec2.assign(8,1); // 重新给vec2赋值,8个成员的初始值都为1
//测试引用类函数
cout<<"vec1.front()="<<vec1.front()<<endl;//vec1第零个成员
cout<<"vec1.back()="<<vec1.back()<<endl;//vec1的最后一个成员
cout<<"vec1.at(4)="<<vec1.at(4)<<endl;//vec1的第五个成员
cout<<"vec1[4]="<<vec1[4]<<endl;
//测试移出和删除
vec1.pop_back();//将最后一个成员移出vec1
vec1.erase(vec1.begin()+1,vec1.end()-2);//删除成员
cout<<"vec1.pop_back() and vec1.erase():" <<endl;
for (i =vec1.begin(); i !=vec1.end(); ++i)
cout << *i << " ";
cout << endl;
//显示序列的状态信息
cout<<“vec1.size(): ”<<vec1.size()<<endl;//打 印成员个数
cout<<"vec1.empty(): "<<vec1.empty()<<endl;//清空
}
//测试deque容器的功能 #include <iostream> #include <deque> using namespace std; //从前向后显示dq队列的全部元素 void put_deque(deque<int> dq, char *name) { deque<int>::iterator i;//声明一个名为i的双向迭代器变量 cout << "The contents of " << name << " : "; for(i = dq.begin(); i != dq.end(); i++) cout << *i << " ";//注意有 "*"号 cout<<endl; } int main() { deque<int> deq1;//deq1对象初始为空 deque<int> deq2(10,6);//deq2对象最初有10个值为6的元素 put_deque(deq1,"deq1");//从前向后显示deq1中的数据 //从deq1序列后面添加两个元素 deq1.push_back(2); deq1.push_back(4); / //从deq1序列前面添加两个元素 deq1.push_front(5); deq1.push_front(7); //在deq1序列中间插入数据 deq1.insert(deq1.begin()+1,3,9); //测试引用类函数 cout<<"deq1.at(4)="<<deq1.at(4)<<endl; cout<<"deq1[4]="<<deq1[4]<<endl; //从deq1序列的前后各移去一个元素 deq1.pop_front(); deq1.pop_back(); //清除deq1中的第2个元素 deq1.erase(deq1.begin()+1); //对deq2赋值 deq2.assign(8,1); }
三种顺序容器均已介绍完了,希望大家和我一样能有所收获,我也将会将自己学到的知识与大家分享//测试list容器的功能 #include <iostream> #include <string> #include <list> using namespace std; void PrintIt(list<int> n) { for(list<int>::iterator iter=n.begin(); iter!=n.end(); ++iter) cout<<*iter<<" ";//用迭代器进行输出循环 } int main() { list<int> listn1,listn2; //给listn1,listn2初始化 listn1.push_back(123); listn1.push_back(0); listn1.push_back(34); listn1.push_back(1123); //now listn1:123,0,34,1123 listn2.push_back(100); listn2.push_back(12); //now listn2:12,100 listn1.sort(); listn2.sort(); //给listn1和listn2排序 PrintIt(listn1); //now listn1:0,34,123,1123 listn2:12,100 cout<<endl; PrintIt(listn2); listn1.merge(listn2); //合并两个排序列表后,listn1:0,12,34,100,123,1123 }