蓝桥杯快速上手 C++ STL

C++ STL


Vector

  • 向量,变长数组

  • 用于初始数组容量不确定的情况

  • 用邻接表实现图

一、使用方式

#include <vector>  
using namespace std;

vector<typename> name;

二、访问方式

  1. 下标访问
  2. 使用迭代器iterator 访问
#include <vector>  
using namespace std;


int main(){
    Vector<int> v;
	v.push();		//向数组中添加元素    
    ...
        
    //1.使用 下标访问
    for(int i = 0;i<v.size();i++){
        printf("%d",v[i]);
    }
    
    //2.使用 迭代器访问
    for(vertor(int)::iterator it = v.begin();it!=v.end();it++){
        printf("%d",*it);
    }
}

三、常用函数

函数名函数作用时间复杂度
push_back()在容器尾部添加元素O(1)
pop_back()在容器尾部删除元素O(1)
size()获取数组容量O(1)
clear()清空数组O(N)
insert(it,x)在迭代器it位置添加x元素O(N)
erase(it)
erase(first,last)
删除迭代器it位置的元素
删除 [first,last) 位置的元素
O(N)

Set

  • 集合

  • 内部自动有序

  • 自动去重

一、使用方式

#include<set>
using namespace std;

set<typename> name;

二、访问方式

  • 只支持 迭代器访问
#include<stdio.h>
#include<set>
using namespace std;

int main(){
    set<int> s;
    s.insert(12);   //添加元素
    ...
        
    for(set<int>:: iterator it = s.begin();it!=s.end();it++){
        printf("%d",*it);
    }
    
}

三、常用函数

函数名函数作用时间复杂度
insert()向集合中插入元素O(N)
find()在集合中查询,返回对应迭代器O(logN)
size()获取集合大小O(1)
clear()清空集合O(1)
erase( it )
earse( value )
erase( first It,last )
删除迭代器所指向的数值
删除指定的数值
删除first It所指向到last地址的元素
O(N)
O(1)
O(last-first)

String

  • 字符串

一、使用方式

#include<string>

string str;

二、访问方式

  1. 通过下标访问
  2. 通过迭代器访问
#include<stdio.h>
#include<string>
using namespace std;

int main(){
    string str = "abcd";
    
    //通过下标访问
    for(int i= 0;i<str.size();i++){
		printf("%c ",str[i]);
    }
    //通过 c_str() 装换为 字符数组 输出
    printf("\n=====================\n");
    printf("%s",str.c_str());
    printf("\n=====================\n");
    //通过迭代器
    for (string::iterator it = str.begin(); it!=str.end();it++){
        printf("%c",*it);
    }

    return 0;
}

三、常用函数

函数名函数功能时间复杂度
operator( += )将字符串拼接O(1)
compare operator
==、<、>、!=
比较运算,比较规则是字典序O(1)
size()
length()
获取长度O(1)
insert( pos,string )
insert(it,it2,it3)
在pos位置插入string
在it位置插入[it2,it3)区间字符
O(N)
erase(i t )
erase(first,last)
erase(pos,length)
删除迭代器所指元素
删除 [ first , last )区间字符
删除从pos位置,删除length个字符
O(N)
clear()清空字符串O(1)
substr(pos,len)截取字符串,返回从pos开始,长度为len的字符O(len)
find(str)判断是否为包涵str,若包涵返回第一次出现的位置O(nm)
replace(pos,len,str)将字符串从pos位置开始,将长度为len的字符替换为strO(N)

Map

  • 映射
  • 将任何类型映射到任何类型,在map中数据以key的字典序排序
  • Map中键和值的都是唯一的,如果需要一个键对应多个值可参考multimap

一、使用方式

#include<map>
using namespace std;

map<typename,typename> name;

二、访问方式

  1. 通过下标访问
  2. 通过迭代器访问
#include <cstdio>
#include <map>
using namespace std;


int main(int argc, char const *argv[])
{
    map<char,int> mp;
    mp['c'] = 12;
    mp['d'] = 13;
    mp['a'] = 1;
    mp['f'] = 43;
    mp['g'] = 1;
    //map中key唯一,后添加的会覆盖前面的值
    mp['c'] = 121;

     printf("%d\n",mp['c']);

    for (map<char,int>::iterator it = mp.begin(); it!=mp.end(); it++)
    {
        //通过it->first访问key的值,通过it->second访问value的值
        printf("%c: %d\t",it->first,it->second);
    }

    return 0;
}


三、常用函数

函数名函数功能时间复杂度
find(key)返回键为key的映射的迭代器O(logN)
erase( it )
erase( key )
arase(first,last)
删除单个元素
删除区间元素
O(1)
O(logN)
O(last-first)
size()获取映射容量O(1)
clear()清空映射O(N)

Queue

  • 队列
  • 先进先出
  • 一般用于广度优先搜索(BFS)

一、使用方式

#include<queue>
using namespace std;

queue<typename> name;

二、访问方式

#include <cstdio>
#include <queue>
using namespace std;

int main(int argc, char const *argv[])
{
    queue<int> q;
    q.push(12);
    q.push(13);
    q.push(15);
	//因为queue是一种先进先出表,所以使用 front() 访问队首元素,back()访问队尾
    printf("%d\n",q.front());
    printf("%d",q.back());
    return 0;
}

三、常用函数

函数名函数功能时间复杂度
push()将元素进队列O(1)
front()访问队首元素O(1)
back()访问队尾元素O(1)
size()获取队列大小O(1)
pop()将队首出队列O(1)
empty()判断队列是否为空O(1)

Priority_queue

  • 优先队列
  • 底层使用来实现,每次队首都是优先级最大的元素 什么是堆?

一、使用方式

#include<queue>
using namespace std;

priority_queue<typename> q;

二、访问方式

#include <cstdio>
#include <queue>
#include <string>
using namespace std;

int main(int argc, char const *argv[])
{
    priority_queue<int,vector<int>,greater<> > q;
    q.push(1);
    q.push(6);
    q.push(3);
	//同队列,有限队列只能使用 top() 来访问队顶首元素
    printf("%d\n",q.top());

    return 0;
}

三、调整优先级

基本数据类型
  • 在优先队列中,基本数据类型默认优先级为:从大到小(char为字典序从大到小)
//以下两种表示无区别
priority_queue<int> q;
priority_queue<int,vector<int>,less<int> q;
  • 第二种表达方式的第二个参数 vector 表示承载 的容器
  • 第三个参数是第一个参数 int 的比较类,less 表示数字越大优先级越大,可替换参数:greater 表示数字越小优先级越大
结构体
#include<queue>
#inclue<string>
using namespace std;

//1.直接在结构体中写比较函数
struct fruit{
    string name;
    int price;
    
    //无参构造
    fruit(){}
    
    //有参构造
    fruit(string _name,int _price){
     	name = _name;
        price = _price;
 	}
    //frieng : 友元
    //将比较运算符重载,price 的价格优先级,price越大,优先级越高
    friend bool operator < (fruit f1,fruit f2){
        return f1.price < f2.price;
    }
}

//2.在结构体外
//定义在结构体外同样适用于其他STL容器(set),重新定义优先级
struct cmp{
    bool operator(fruit f1,fruit f2){
        return f1.price < f2.price;
    }
}

//重新定义了优先级后,便可以使用 下面参数 来定义
priority_queue<int,vector<int>,cmp> p;

四、常用函数

函数名函数功能时间复杂度
push()将元素进队列O(logN)
top()访问队首元素O(1)
size()获取队列大小O(1)
pop()将队首出队列O(logN)
empty()判断队列是否为空O(1)*
  • 使用 top() 函数之前应该使用 empty() 函数判断容器是否为空,否则可能因为队空出现问题

Stack

  • 后进先出

  • 用来模拟递归,防止栈内存的限制而导致程序出错

一、使用方式

#include<stack>
using namespace std;

stack<typename> name;

二、访问方式

#include <cstdio>
#include <stack>
using namespace std;


int main(int argc, char const *argv[])
{
    stack<int> s;
    s.push(12);
    s.push(3);
	//由于 栈 是一个先进后出表,所以只能使用 top() 访问队首元素
    printf("%d", s.top());

    return 0;
}

三、常用函数

函数名函数功能时间复杂度
push()将元素 入栈O(1)
pop()将元素栈顶元素 出栈O(1)
top()获取栈顶元素O(1)
size()获取 栈 的容量O(1)
empty()判断栈是否为空O(1)

algorithm常用函数

函数名函数功能
min(x,y)比较两个数的大小,返回较小的
max(x,y)比较两个数大小,返回较大的
abs()返回 整数 类型的绝对值
swap(x,y)交换两个数的值
reverse(p1,p2)可以将数组指针在 [p1,p2)间的元素反转
next_permutation()返回一个序列全排列的下一个 序列
fill ( first,last,val )将数组或容器中任意一段区间赋相同值
sort()将可比较元素的区间进行排序
lower_bound(first,last,val)在一个 有序 的数组(容器)中,返回在 [ first,last )区间里第一个值大于等于 val 元素的位置(指针)
upper_bound()在一个 有序 的数组(容器)中,返回在 [ first,last )区间里第一个值大于 val 元素的位置(指针)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值