标准模板库与STL算法
泛型:
是标准模板库的核心思想,所谓的泛型是指对象脱离对象所属的数据类型。
STL是泛型程序库:
它的所有组件都是由template构成,其元素可以是任意类型。
C++标准库有6大组件构成:
(1)泛型算法;
(2)泛型容器;
(3)泛型迭代器;
(4)函数对象;
(5)适配器;
(6)分配器;
1.容器: 管理某类对象的集合;
2.迭代器: 在对象集合上进行遍历;
3.算法: 提供处理集合内元素的算法; C++标准,STL被组织了13个头文件,
一,STL算法
STL利用函数模板定义了70多个常用算法算法主要包含在,,
常用的:
一,sort
code:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[]={
2,5,8,6,8,5,55,88,8};
int len=(sizeof(a)/sizeof(*a));
sort(a,a+len);
for(int i=0;i<len;i++){
cout<<a[i]<<' ';
}
return 0;
}
扩展(sort用处十分广泛,sort(a,a+n)是默认从小到大排,自己也可以根据需求从大到小排,甚至可以对结构体排序);
code:
//使用sort实现结构体排序
#include<iostream>
#include<algorithm>
using namespace std;
struct Point{
int x;
int y;
}p[4];
bool cmp(Point p1,Point p2){
if(p1.x==p2.x){
return p1.y<p2.y;
}else{
return p1.x<p2.x;
}
}
int main(){
for(int i=0;i<4;i++){
cin>>p[i].x;
cin>>p[i].y;
}
sort(p,p+4,cmp);
for(int i=0;i<4;i++){
cout<<"("<<p[i].x<<","<<p[i].y<<")"<<endl;
}
return 0;
}
二,count(返回从起点,到终点,key出现的次数)
code:
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
string str("one world one dream");
char key='e';
n=count(str.begin(),str.end(),key);
cout<<"key count:"<<n<<endl;
return 0;
}
三,其他算法
二,容器
STL容器用于存放,容纳各种不同类型的数据,他们实现为类模板。
STL容器分为三大类:
1)顺序容器;
2)关联容器;
3)容器适配器;
1.顺序容器;
一,向量(vector):连续存储的元素;
二,列表(list):由结点组成的双向链表,每个结点包含一个;
三,双队列(deque):连续存储的指向不同元素的指针组成的数组;
2.关联容器:
一,集合(set):不能有相同的元素;
二,多重集合(meltiset):可以有相同的元素;
三,映射(map):{key,value}组成的集合;
3.容器适配器:
一,栈(stack):first in last out
二,队列(queue):first in first out
三,优先队列(priority_queue):优先级高的排在前面;
注意:
vector使用实例:
code:
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector <int> vi;
int a;
while(true){
cout<<"输入一个整数,按0停止"<<endl;
cin>>a;
if(a==0)break;
vi.push_back(a);
}
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
创建vector
访问vector中的元素
vector中插入或删除函数
vector的逆序与拷贝:
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[6]={
1,25,25,88,11,2};
vector<int> v1(arr,arr+6),v2;//v1的初始化
v2.resize(6);//发配大小
copy(v1.begin(),v1.end(),v2.begin());//复制函数
reverse(v2.begin(),v2.end());//逆序函数
for(int i=0;i<v2.size();i++){
cout<<v2[i]<<" ";
}
return 0;
}
三,迭代器
iterator是经过封装后的高级指针,用户无需关心对象的数据类型,就可以遍历容器或序列;
迭代器在头文件:,,
迭代器遍历过程:
begin()与end():
迭代器遍历实例:
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[6]={
1,25,25,88,11,2};
vector<int> v1(arr,arr+6);
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++){
cout<<*it<<' ';
}
return 0;
}
进阶练习:(两个链表的有序归并)
input_case:
3 3
-1 22 8
9 -88 2
output_case:
-88 -1 2 8 9 22
code:
#include<iostream>
#include<list>
using namespace std;
int main(){
list<int> l1,l2;
int len_1,len_2;//两个链表的长度
scanf("%d %d",&len_1,&len_2);
int num;
for(int i=0;i<len_1;i++){
cin>>num;
l1.push_back(num);//加入链表
}
for(int i=0;i<len_2;i++){
cin>>num;
l2.push_back(num);//加入链表
}
l1.sort();//表1排序
l2.sort();//表2排序
l1.merge(l2);//l2归并到l1中
for(list<int>::iterator it=l1.begin();it!=l1.end();it++){
//迭代器遍历
cout<<*it<<' ';
}
return 0;
}
迭代器类型:
不同的容器对迭代器的支持与否:
注意:迭代器也可以通过下标进行赋值(仅适用于支持随机访问的)比如vector可以,但list不行