STL常用总结

为什么要用STL,STL的好处?
STL是一个打包了数据结构的函数库,STL的所有对象都没必要提前分配内存大小,它会根据对象存取数据的大小来分配空间大小(系统自动扩张)

1.vector(向量)(底层是数组)
向量没有确定数据类型所以向量可以是多种数据类型,但是注意一个向量对象只能有一种数据类型,可以构造二维向量(二维数组)比如二维整型向量vector 值得注意的是二维向量的大元素和小元素(行元素和最小元素)都是一个向量可以不分配大小而是通过数据的规模分配大小

这里介绍整型向量的常用方法函数(其他类型的可以自行通过转换类型达到相同的效果):

vector a(10); //定义了10个整型元素的向量
vector a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
vector a(b); //用b向量来创建a向量,整体复制性赋值
vector a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
a.assign(4,2); //是a只含4个元素,且每个元素为2
a.back(); //返回a的最后一个元素
a.front(); //返回a的第一个元素
a.clear(); //清空a中的元素
a.empty(); //判断a是否为空,空则返回ture,不空则返回false
a.pop_back(); //删除a向量的最后一个元素
a.erase(a.begin()+1,a.begin()+3); //删除a中第1个(从第0个算起)到第2个元素
a.push_back(5); //在a的最后一个向量后插入一个元素,其值为5
a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5
a.insert(a.begin()+1,3,5); //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.size(); //返回a中元素的个数;
a.capacity(); //返回a在内存中总共可以容纳的元素个数
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换

vector的find函数是一个比较特殊的函数他的返回值必须用迭代器接收
迭代器即为一个存储某个值在向量中的地址 整型迭代器的定义方式:vector::iterator 可以接收vector的元素的地址
vector的find函数: vector::iterator it; it=find(a.begin(),a.end(),int) 其中a为vector的对象
此时为查找a开头到结尾是否有这个值,如果没有就会返回a.end().

2.string(字符串)

字符串也能根据其值的大小来自动分配空间,相当于字符数组但是不需要提前分配空间
string 可用+直接连接字符串
这里介绍string的常用函数:

string str; //定义了一个空字符串str
str = “Hello world”; // 给str赋值为"Hello world"
string s1(str); //调用复制构造函数生成s1,s1为str的复制品
cout<<s1<<endl;
string s2(str,6); //将str内,开始于位置6的部分当作s2的初值
string s3(str,6,3); //将str内,开始于6且长度顶多为3的部分作为s3的初值
string s4(cstr); //将C字符串作为s4的初值
string s6(5,‘A’); //生成一个字符串,包含5个’A’字符
string s7(str.begin(),str.begin()+5); //区间str.begin()和str.begin()+5内的字符作为初
int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)
int size(); //返回当前字符串的大小
int length(); //返回当前字符串的长度
bool empty(); //当前字符串是否为空
find 函数一般用string::size_type这个迭代器接收
find( const basic_string &str, size_type index );
//返回str在字符串中第一次出现的位置(从index开始查找),如果没找到则返回string::npos
find( const char *str, size_type index ); // 同上
find( const char *str, size_type index, size_type length );
//返回str在字符串中第一次出现的位置(从index开始查找,长度为length),如果没找到就返回string::npos npos可以看作一个int的值
size_type find( char ch, size_type index );
// 返回字符ch在字符串中第一次出现的位置(从index开始查找),如果没找到就返回string::npos
string &insert(int p,const string &s); //在p位置插入字符串s
string &replace(int p, int n,const char *s); //删除从p开始的n个字符,然后在p处插入串s
erase的三种用法(上闭下开):
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
string substr(int pos ,int n ) ; //返回pos开始的n个字符组成的字符串
void swap(string &s2); //交换当前字符串与s2的值
string &append(const char *s); //把字符串s连接到当前字符串结尾
void push_back(char c) //当前字符串尾部加一个字符c
transform(str.begin(),str.end(),str.begin(),::tolower)//将从头到尾的字符全部小写
transfom(str.begin(),str.end(),str.begin(),::toupper)//将从头到尾的字符全部大写

3.set(集合)(底层红黑树)

set即为一个红黑树(是一种自平衡二叉查找树,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能.它虽然是复杂的,但它的最坏情况运行时间也是非常良好的可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目),其作用是将排入的数据自动进行去重并且按照树的特性(左孩子的值一定比父节点的小,右孩子的值一定比父节点大) 可起到二分搜索的一个作用,但是这里一般常用的是查找是否右一个值在set里面和去重

下面介绍set的常用函数:
insert() 向set容器插入一个元素
push() 向set容器的尾部插入一个元素
begin()    ,返回set容器第一个元素的迭代器
end()      ,返回一个指向当前set末尾元素的下一位置的迭代器.
clear()    ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin()     ,返回的值和end()相同
rend()     ,返回的值和begin()相同
count() 查找其值是否在set中存在

find() ,返回给定值值得定位器并赋值给迭代器,如果没找到则返回end()。

set集合的两个特点,有序和不重复。自动排序
count() 用来查找set中某个值出现的次数//一个值在set中只可能出现0次或者1次,这个函数主要是用于判断这个值是否在set中出现过
erase(iterator) ,删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值

4.priority_queuqe(优先队列)(底层为大根堆小根堆)
priority_queue的底层为堆,大根堆(根节点的值是整个堆最大的,所有的子节点都比父节点的值小)和小根堆(根节点的值是整个堆最小的,所有的子节点都比父节点大)

empty()    如果队列为空,则返回真

pop()    删除对顶元素,删除第一个元素

push()    加入一个元素

size()     返回优先队列中拥有的元素个数

top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素

1、普通方法:

priority_queue q;              //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector, greater > q;   //通过操作,按照元素从小到大的顺序出队
2、自定义优先级:

bool cmp(int x, int y)
     return x > y;   // x小的优先级高 //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
};
可以根据algorithm里面打包的快排sort进行改进比如sort(a,a+n,cmp)就能产生自定义排序
priority_queue<int, vector, cmp> q; //定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。

实用方法就是解决堆排序问题
比如洛谷上的贪心的第一个题合并果子
每次都需要吧合并了的和原来剩下的一起排序用sort显然超时,可用堆排序,但是堆排序太冗杂(看过都知道太长了qaq)这时可以用STL中的优先队列解决问题

#include<bits/stdc++.h>
using namespace std;

int main()
{
	priority_queue<int, vector<int>, greater<int> >q;
	int n;
	cin >> n;
	int x;
	while (n)
	{
		cin >> x;
		q.push(x);
		n--;
	}
	int ans = 0;
	while (q.size() >= 2)
	{
		int a = q.top();
		q.pop();
		int b = q.top();
		q.pop();
		ans += (a + b);
		q.push(a+b);
	}
	cout << ans << endl;
	return 0;
}

5.queue(队列)(底层list或者deque)
queue 模板类的定义在头文件中。
与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类
型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
定义queue 对象的示例代码如下:
queue q1;
queue q2;

queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。

6.map(映射)(底层为红黑树)

map提供一对一的hash,Map主要用於資料一對一映射(one-to-one)的情況,map內部的實現自建一顆紅黑樹,這顆樹具有對數據自動排序的功能。比如一個班級中,每個學生的學號跟他的姓名就存在著一對一映射的关系
这里介绍常用的方法函数:
map<string, string> mapStudent;//定义变量,一对一数据类型,

//用insert函數插入pair
mapStudent.insert(pair<string, string>(“r000”, “student_zero”));

//用"array"方式插入
mapStudent[“r123”] = “student_first”;
mapStudent[“r456”] = “student_second”;

iter = mapStudent.find(“r123”)//和以往的find的返回值相同如果额米有查询到就返回end(),如果右就返回其所在地址

clear()清空
empty()判断是否为空,若为空则返回true
三种erase()方式:
mapStudent.erase(iter);//迭代器删除

int n = mapStudent.erase(“r123”);//关键字删除,如果刪除了會返回1,否則返回0

mapStudent.erase(mapStudent.begin(), mapStudent.end())//此时为删除所有元素,上闭下开

7.list(链表)(底层双向链表)
这里介绍常用的方法函数
//定义变量
lista{1,2,3}
lista(n)//定义了n个初始值为0的元素
lista(n,m)定义了n个初始值为m的元素
begin();//起始位置迭代器
end();//末尾位置下一个位置迭代器
size()//返回长度
push_back()//从末尾加入
push_front()//从开头加入
empty()//检查其是否为空
resize(n)//将链表改为最多只能容纳n个元素超出的将会删除
clear();//清空链表
front()//返回首元素
back()//返回末尾元素
pop_back()//删除末尾元素
pop_front()//删除首元素
a.assign(n,val)//将a中的所有元素全部替换成n个val元素
b.assign(a.begin(),a.end())将b的元素全部替换成a的元素
swap()//交换
reserve()//当前逆序排列
insert(a.begin(),100)//在a开头插入100
insert(a.begin(),2,100)//在a开头插入两个100
insert(a.begin(),b.begin(),b.end())//在a开头插入b的全部元素
a.erase(a.begin())//删除a开头的元素
a.erase(a.begin(),a.end())//删除a的全部元素
a.remove(4)从a中移除所有值为4的元素
8.stack(栈)(底层为list或者deque)
stack的底层就是一个栈其底层默认容器为deque(双向队列),栈的特性是后进先出并且只有一端有接口可以进行操作
下面介绍常用的方法函数:
top()//返回栈顶元素;
pop()//删除栈顶元素
push()//将一个元素压入栈顶
empty()//检查其是否为空
size()//返回长度
stack<>//定义对象
stack<int,vector<>//定义一个底层为vector的int栈

deque a;
stackb(a) //将底层相同的对象赋值给stack

posted @ 2019-08-15 20:34  如梦山河乀  阅读(159)  评论(0编辑  收藏  举报