C++---标准模板库与STL算法

标准模板库与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不行

猜你喜欢

转载自blog.csdn.net/timelessx_x/article/details/115029005