【考研复试上机】算法速记

本文详细介绍了C++STL中常用的数据结构如vector、set、map、multiset、unordered_set以及priority_queue、deque等的排序、查找、插入、删除和基本操作,包括元素比较、去重、访问、迭代器使用以及algorithm库中的函数应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排序与查找

结构体排序

vector<ST> vi;
sort(vi.begin(),vi.end(),[](ST t1, ST t2){
    return t1.first<t2.first;
});

vector排序

vector<int> vi;
sort(vi.begin(),vi.end(),[](int t1, int t2){
    return t1<t2;
});

sort(nums.begin(), nums.end(), greater<int>()); //greater:由大变小

stable_sort()

是对给定区间的元素进行稳定排序,如果两个元素相等,那么排序完成后两个元素的相对位置保持不变

自带的二分

  • 返回大于或等于目标值的第一个位置
int pos = lower_bound(vi.begin(),vi.end(),val) - a.begin();
  • 返回大于目标值的第一个位置
int pos = upper_bound(vi.begin(),vi.end(),val) - a.begin();
  • 若目标值存在则返回true,否则返回false
bool exist = binary_search(vi.begin(),vi.end(),val);

字符串

getline

string s;
getline(cin,s); //可以读入空格和制表符,以回车符作为结束标志

int、string 转换

int化为string

int a=100;
srtring s=to_string(a);

string转换为int

//利用stoi[s to int]
int x = stoi(x);

char 转换为int

int t = s[i] - '0'

字符判断函数

  • isalpha(c):字母
  • islower(c): 小写字母
  • isupper(c): 大写字母
  • isdigit(c): 数字
  • isspace(c):空白字符
  • isblank(c): 空格字符

字符串分割

string s;
getline(cin,s);
istringstream is(s);
string buffer;

while(getline(is,buffer,'/')) cout<<buffer<<endl;

查找t是否为s的子串:

s.find(t);//如果t是s的子串则返回首次匹配的位置,否则返回 string::npos 或 -1

//如果找到
if(s.find(t)!=-1)

s.find(t,pos)//是用来寻找从pos开始(包括pos处字符)t。
    
s.rfind(t) //是从字符串右侧开始匹配

字符串提取

string a=s.substr(pos,len); //返回从pos位开始,长度为len的子串

//如果开始位置pos加上计数值len大于string的大小,则substr会调整计数值,只拷贝到string的末尾。

统计某个字符的个数

int cnt = count(s.begin(),s.end(),‘a’)

STL

vector

常用函数

  • vector在最后添加元素
vi.push_back(val)
  • vector删除最后的元素
vi.pop_back()
  • 通过find函数来查找某一个值对应的迭代器
vector<int>::iterator it = find(arr.begin(), arr.end(), val);

if(it!=arr.end()) return true; //当查找失败时,返回的时arr.end()
  • 清空vector中所有的元素
vi.clear()
  • vector内的元素逆置
vector<int> vi ={1,2,3,4,5,6};
reverse(vi.begin(),vi.end());  //vi反转后为6,5,4,3,2,1
  • vector容器的swap方法
v1.swap(v2)
  • vector容器中找到最大元素的位置
maxPosition = max_element(vi.begin(), vi.end());
  • 对vector内元素进行去重的方法
// 使用 set 进行去重
set<int> st(vi.begin(), vi.end());
vector<int> viNew(st.begin(), st.end());
  • 通过迭代器的位置返回值来获取数组位置下标的方法
//distance,它返回的是两个迭代器之间的距离。

//使用这个函数,就能完成迭代器与下标之间的转换:下标 = 当前迭代器位置-容器头部

//注:在使用过程中,可以结合begin()和返回的迭代值进行求下标的计算。

vector<int>::iterator first = vi.begin();
vector<int>::iterator it = find(arr.begin(), arr.end(), val);
distance(first,it)

set

  • set内的元素递增排序
  • 自动去重

set容器内元素的访问:

  • 访问第一个值【最小值】:*st.begin()

  • 访问最后一个值【最大值】:*st.rbegin()

//只能通过枚举的方式访问
for(set<int>::iterator it = st.begin();it!=st.end();it++){
    cout<<*it<<endl;
}
  • 将x元素插入set中
st.insert(x)
  • 在set中查找value,并返回其迭代器
set<int>::iterator it = st.find(value);
cout<<*it<<endl;

cout<<*(st.find(value));         

multiset

  • 能时刻保证序列中的数是有序的,而且序列中可以存在重复的数
multiset<int> mst;

unordered_set

  • 只去重,不排序
unordered_set<int> ust;

map

  • map中的键是唯一的
  • map会以键从小到大的顺序自动排序

map容器内元素的访问:

  • 通过下标访问:mp['c']

  • 通过迭代器访问:

    • map<typename1,typename2>::iterater it;
      it->first;//访问键
      it->second;//访问值
      
  • 返回为key的迭代器it

map<char,int>::iterator it = mp.find(key);
  • 判断map的键是否已经存在了
mp.count(key)//返回值是一个整数,1表示有这个元素,0表示没有这个元素。
  • 查找容器中的元素的个数
mp.size();
  • mp.clear();

  • mapvalue进行排序的方法

//先把map装进pair里,然后再放入vector,自定义sort实现排序
vector<pair<int,int>> vi;

sort(vi.begin(),vi.end(),[](pair<int,int> p1, pair<int,int> p2){
	return p1.second>p2.second;
})

multimap

  • 一个键可以对应多个值

unordered_map

  • 只映射,而不按key排序

queue

  • 使用pop()front()函数前,需要用empty()函数判断队列是否为空
q.front();//访问队首元素

q.back();//访问队尾元素
  • q.push(x):将x入队
  • q.pop():将队首元素出队
  • q.empty():检测queue是否为空

priority_queue【实质是大根堆/小根堆】

  • 队首元素是当前队列中优先级最高的元素
priority_queue<typename> name;
  • priority_queue容器内元素的访问:
q.top();//只能访问队首元素,相当于访问堆顶元素

priority_queue常用2函数:

  • q.push(x):将x入队
  • q.pop():将队首元素出队
  • q.empty():检测优先队列是否为空
  • q.size():返回优先队列内元素的个数

priority_queue优先级的设置:

priority_queue<int, vector<int>, less<int> > a; //less:减小,从大到小,是大根堆【默认】   

priority_queue<int, vector<int>, greater<int> > s; //greater:增大,从小到大,是小根堆

deque[双端队列]

  • 在队列尾部添加元素
dq.bush_back()
  • 在队列头部添加元素
dq.push_front()
  • 删除队列尾部的元素
dq.pop_back()
  • 删除队列头部的元素
dq.pop_front()
  • 获得头部元素
dq.front()
  • 获得队列尾部元素
dq.back()

stack

st.top();//只能访问栈顶元素

易错点!在使用st.top()之前,要先判空:st.empty();
  • st.push(x):将x入栈
  • st.pop():将栈顶元素弹出
  • st.empty():检测栈是否为空
  • st.size():返回栈内元素的个数

pair

  • 可以直接用==、!=、<等运算符比较,比较规则:先以first的大小作为标准,当first相等时,再去判别second
  • 代替二元结构体机器构造函数,节省编码时间
  • 作为map的键值对来进行插入:mp.insert(make_pair("haha",3));
pair<typename1,typename2> name;

在代码中临时构建pair

pair<string,int > ("haha",5);
make_pair("haha",5);

元素访问

pair<int ,int > p;
p.first;
p.second;

algorithm头文件下的常用函数

  • fabs(double x):double型变量取绝对值

  • floor(double x):double型变量向下取整

  • ceil(double x):double型变量向上取整

  • pow(double r, double p) :返回rpr^prp

  • sqrt(double x):返回double型变量的算术平方根

  • round(double x):将double型变量四舍五入

  • next_permutation():给出一个序列在全排列中的下一个序列

    int a[10]={1,2,3};
    do{
    	cout<<a[0]<<a[1]<<a[2]<<endl;
    }while(next_permutation(a,a+3));
    
  • fill(arr,arr+n,x):用于对数组赋予其他的数字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FOUR_A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值