c++标准模版库(STL)教程

1、介绍

c++ 标准模板库(以下简称STL)是一套功能强大的 c++ 模板类

为我们提供了通用的模版类与基本函数

对于初学者来说,已经可以用其实现多种常用的算法与数据结构

比如:向量、链表、队列、栈等等

STL的主要包括六部分

容器(Containers)用于存放数据,可以存放变量或者对象
算法(Algorithms)
迭代器(Iterators)
仿函数(Functors)
适配器(Adaptors)
分配器(Allocators)

2、容器(Containers)

容器主要有三种类型,顺序性容器、关联性容器与容器适配器

2.1、顺序性容器

主要有:vector(动态数组)、list(双向链表)、deque

2.1.1、vector(动态数组)

又称可变长数组、向量,开在堆空间里,避免了在局部区域中数组过大而导致爆栈的问题

所以局部区域中不可以开大长度数组,但可以开 vector

优缺点:方便查找元素,但插入操作麻烦

2.1.1.1、头文件
#include<vector>//万能头包含
2.1.1.2、初始化

模板:

vector < 数据类型 > 名称 ( 长度 , 初值 );

列如:

vector<int> a;//定义数组a,存储int类型数据 
vector<double> b;//定义数组b,存储double类型数据 
vector<node> c;//定义数组c,存储结构体node
vector<int> d(10);//限制下标为 0~10-1 
vector<int> e(10,5);//限制下标为 0~10-1,并将所有元素初始值设为5
vector<int> f(a);//将数组a拷贝到f
vector<int>::iterator it;//定义迭代器
2.1.1.3、函数

向量大小: a.size( );

更改大小为a: a.resize( a );

向量判空: a.empty( );

末尾添加a: a.push_back( a );

末尾删除元素: a.pop_back( );

a位置插入b: a.insert( a,b );

a位置插入n个b:a.insert( a,n,b );

a位置删除元素: a.erase( a );

交换 a,b 元素: a.swap( a,b );

清空元素: a.clear( );

开始指针:a.begin( );

末尾指针:a.end( ); 

标访问a位置: a[ a ];

返回第一个元素:a.front( );

返回最后一个元素:a.back( );

#include<bits/stdc++.h>
using namespace std;
vector<int> a(10,1);
vector<int> b(10,4); 
void print(){
	vector<int>::iterator it;
	for(it=a.begin();it!=a.end();it++)
		cout<<*it<<' ';
	cout<<endl;
}
int main()
{
	cout<<a.size()<<endl;
	a.pop_back();
	print();
	a.resize(15);
	cout<<a.size()<<endl;
	print();
	a.push_back(2);
	a.insert(a.begin()+3,3);
	print();
	a.erase(a.begin()+2);
	print();
	a.swap(b);
	print();
    cout<<a.front()<<' '<<a.back()<<endl;
	cout<<a.empty()<<' ';
	a.clear();
	cout<<a.empty();
    return 0;
}
2.1.1.4、算法

遍历元素:

vector<int>::iterator it;
for(it=a.begin();it!=a.end();it++)
	cout<<*it;

元素翻转:

reverse(a.begin(),a.end());

2.1.2、list(双向链表)

元素在内存中的位置不一定连续,要访问一个元素要依靠它的前驱或者后继

同时它是一个循环链表,可以节省不必要的空间

只能通过迭代器访问,关于迭代器,不能有 +=n 或 -=n 的操作(仅限 list )

优缺点:存储不连续,方便元素插入与删除操作,但不能进行随机访问,占用内存多

2.1.2.1、头文件
#include<list>//万能头包含 
2.1.2.2、初始化

模版:list  < 数据类型 >  名称  ( 长度 , 初值  );

list<int> a;//定义链表a,类型为int
list<double> b;//定义链表b,类型为int 
list<node> c;//定义链表c,类型为结构体note(要提前声明) 
list<int> d(10);//定义长度为10的链表d 
list<int> e(10,5);//定义长度为10的链表e,初值为5
list<int> f(a);//拷贝a到f 
list<int>::iterator it;//定义迭代器
2.1.2.3、函数

开头插入a:a.push_front( a );

开头删除元素:a.pop_front( );

删除与a值相等的元素:a.remove( a );

返回第一个元素:a.front( );

返回最后一个元素:a.back( );

大小: a.size( );

更改大小为a: a.resize( a );

链表判空: a.empty( );

末尾添加a: a.push_back( a );

末尾删除元素: a.pop_back( );

a位置插入b: a.insert( a,b );

a位置插入n个b:a.insert( a,n,b );

a位置删除元素: a.erase( a );

交换 a,b 元素: a.swap( a,b );

清空元素: a.clear( );

开始指针:a.begin( );

末尾指针:a.end( ); 

#include<bits/stdc++.h>
using namespace std;
list<int> a(10,1);
list<int> b(10,4); 
void print(){
	list<int>::iterator it;
	for(it=a.begin();it!=a.end();it++)
		cout<<*it<<' ';
	cout<<endl;
}
int main()
{
	cout<<a.size()<<endl;
	a.pop_back();
	print();
	a.resize(15);
	cout<<a.size()<<endl;
	print();
	a.push_back(2);
	a.insert(a.begin(),2,3);//不能用+n 
	print();
	a.erase(a.begin());//不能用-n 
	print();
	a.swap(b);
	print();
	a.push_front(5);
	a.push_front(6);
	print();
	a.pop_front();
	print();
	a.remove(4);
	print();
	a.resize(2);
	cout<<a.front()<<' '<<a.back()<<endl;
	cout<<a.empty()<<' ';
	a.clear();
	cout<<a.empty();
    return 0;
}
2.1.2.4、算法

元素遍历

list<int>::iterator it;
for(it=a.begin;it!=a.end;it++)
    cout<<*it;

2.1.3、deque(双向队列)

2.2.关联性容器

2.2.1、set(集合)

2.2.2、multiset(多重集合)

2.2.3、map(映射)

2.2.4、multimap(多重映射)

3、算法

4、迭代器

5、仿函数

6、适配器

7、分配器

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值