蓝桥杯STL基础学习笔记

本文介绍了C++中vector容器的使用,包括初始化、长度更改、元素操作,以及string类的处理、迭代器的应用、map的使用、排序算法如sort和二分查找,以及堆(优先队列)的实现。
摘要由CSDN通过智能技术生成

用什么的时候要把对应的库包含,并且要指明命名空间

Vector

#include<stdio.h>
#include<vector>//对应的库
using namespace std;//指明命名空间
int main(){
return 0;
}

1.vector的初始化

#include<stdio.h>
#include<vector>//对应的库
using namespace std;//指明命名空间
int main(){
	//第一节课 
	int iarr[] ={1,2,3,4,5};
	//vector的初始化(里面有值) 
	vector<int> v1(10);//指定初始化长度,默认初始化默认元素为0,如果不初始化长度默认长度为0
	vector<int> v1(iarr,iarr+5);//传递两个指针(地址),左闭右开 
	vector<int> v2(3,10);//传递个数和值 
	vector<int> v3(v1);//拷贝vector 
	vector<int> v4 =v1; //拷贝vector 
	for(int i=0;i<v4.size();i++){
		printf("%d",v4[i]);
	}
return 0;
}

2.声明后通过方法初始化

#include<stdio.h>
#include<vector>//对应的库
using namespace std;//指明命名空间
int main(){
	int iarr[] ={1,2,3,4,5};
	vector<int> vectorIntA,vectorIntB,vectorIntC,vectorIntD;
	vectorIntA.assign(iarr+1,iarr+3);//通过指针,指针可以更改 
	vectorIntB.assign(vectorIntA.begin(),vectorIntA.end()); //迭代器也可以更改 
	//如果assign函数,拷贝一个范围到vector中,但是原本的数据会丢失
	vectorIntC.assign(4,10);
	for(int i=0;i<vectorIntA.size();i++){
		printf("%d ",vectorIntA[i]);
	} 
	printf("\n");
	for(int i=0;i<vectorIntB.size();i++){
		printf("%d ",vectorIntB[i]);
	}
	printf("\n");
	for(int i=0;i<vectorIntC.size();i++){
		printf("%d ",vectorIntC[i]);
	}
	//交换两个vector的值
	vectorIntA.swap(vectorIntC);
return 0;
}

3.更改vector的长度

#include<stdio.h>
#include<vector>//对应的库
using namespace std;//指明命名空间
int main(){
	vector<int> v1(3,10);
	
	printf("数组没有改变时\n");
		for(int i=0;i<v1.size();i++){
		printf("%d ",v1[i]);
	}
	printf("\n");
	//v1.resize(10);//增加长度,长出的部分以默认值0填充
	//v1.resize(8,10);//增加程度,长度部分用10来填充 
	v1.resize(1);//减少长度,比这个长度长的元素全部被移出 
	printf("数组已经改变时\n");
	for(int i=0;i<v1.size();i++){
		printf("%d ",v1[i]);
	} 
return 0;
}

vector中取元素

#include<stdio.h>
#include<vector>//对应的库
using namespace std;//指明命名空间
int main(){
	vector<int> v1(4);
	if(v1.empty()){
	//这个empty函数是用过size来确定的,当size是0的时候就空,因为如果有size那么就有元素,默认是0 
	}
	else{
		int temp=4;
		 v1.push_back(temp);
		for(int i=0;i<v1.size();i++){
		printf("%d",v1[i]);
	}
	}
	//取元素 
	//v1[8];//无报错,当元素下标超出size时
	//v1.at(8);//有报错 
return 0;
}

vector中插入元素

#include<stdio.h>
#include<vector>//对应的库
using namespace std;//指明命名空间
int main(){
	vector<int> v1;
	//从末尾加入元素
	v1.push_back(10);
	//删除末尾元素 
	v1.pop_back(); 
	v1.insert(v1.begin(),100);//第一个参数是指定位置的指针,第二个是元素,返回新数据的位置 
	v1.insert(v1.begin(),3,1000);//在指定位置插入多个元素 */
	int b[]={40,50,60,70,80,90};	
	v1.insert(v1.begin(),b,b+6);//指定位置插入一段数据
	vector<int> v2;
	v2.insert(v2.begin(),v1.begin(),v1.end());//如果是容器那就要函数 
		for(int i=0;i<v2.size();i++){
		printf("%d ",v2[i]);
	} 
return 0;
}

String类

头文件

#include<iostream>//c++里的标准输入输出流
#include<string>//c++中的string类型
#include<string.h> //c中实现的string,本质上是一个char数组

string是c++中特有的类,所以我们要对string进行输入和输出的时候,我们应该用iostream中的cin>> cout<<来进行操作;
(待补充,iostream中的基本语法)
1.string的初始化

#include<stdio.h>
#include<string>//string类 
#include<iostream>
using namespace std;
int main(){
	string s1="A23456a";
	string s2="qqqqqq";
	cout<<s1;
	return 0;
}

1.1读入string

#include<stdio.h>
#include<string>//string类 
#include<iostream>
using namespace std;
int main(){
	string s1;
	cin>>s1;
	cout<<s1+"\n";
	cout<<s1;
	return 0;
}

2.读取字符串的长度

#include<stdio.h>
#include<string>//string类 
#include<iostream>
using namespace std;
int main(){
	string s1;
	cin>>s1;
	int length=s1.length(); //str.size()
	cout<<length;
	return 0;
}

3.获取字符(和char数组方式一致)

#include<stdio.h>
#include<string>//string类 
#include<iostream>
using namespace std;
int main(){
	string s1;
	cin>>s1;
	printf("%c",s1[0]);
	return 0;
}

4.比较和赋值(按字典序比较,直接和int一个写法即可)

#include<stdio.h>
#include<string>//string类 
#include<iostream>
using namespace std;
int main(){
	string s1;
	string s2;
	cin>>s1;
	cin>>s2;
	if(s1>s2){
		printf("s1>s2");//字符比大小 
	}else if(s1==s2){
		printf("s1=s2");
	}else{
		printf("s1<s2");
	}
	return 0;
}
#include<stdio.h>
#include<string>//string类 
#include<iostream>
using namespace std;
int main(){
	string s1;
	cin>>s1;
	string s2=s1;
	cout<<s2;
	return 0;
}

剩下的一些常见用法

#include<stdio.h>
#include<string>//string类 
#include<iostream>
#include<algorithm> 
using namespace std;
int main(){
	string s1="123";
	//find从头开始查找字符或者字符串,rfind倒着
	//npos表示查找失败的状态
	//这里再使用string的命名空间就会出错,估计是有重名 
	if(s1.find("12")!=string::npos){
		printf("查找成功");
	}else{
		printf("查找失败");
	}
	string s2 = s1.substr(0,2);//截取子串,从0位置截取2个长度 
	cout<<s2;
	//把当前字符串反转 
	reverse(s1.begin(),s1.end());
	cout<<s1;
	return 0;
}

大小写转换

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
	string str;
	cin>>str;
	//前两个参数指定从哪里到哪里,第三个参数指定结果放到哪里 
	transform(str.begin(),str.end(),str.begin(),::tolower);//大写转小写
	transform(str.begin(),str.end(),str.begin(),::toupper);//小写转大写
	cout<<str;
	return 0;
} 

string类型和int和double类型的转化

#include <iostream>
#include <string>
using namespace std;
int main() {
    std::string str = "12345";
    //stof,stod 可以将string类型转化为float和double 
    int num = stoi(str);
    std::cout << num << std::endl;
    return 0;
}

3.迭代器的使用
iterator的begin是返回数组的第一个元素,end是最后一个元素的下一个元素,某些情况下insert之后会让迭代器失效,因为内存整体搬离了位置
当v里面没有元素的时候begin和end的返回值相同

#include<iostream>
#include<vector>
using namespace std;
int main(){
	int a[]={1,2,3,4,5,6};
	vector <int>v(a,a+6);
	vector <int>::iterator it;
	it = v.begin();
	for(;it!=v.end();it++){
		cout<<*it;
	}
	return 0;
} 

map的基本使用

#include<iostream>
#include<vector>
#include<map>
using namespace std;
class Student{
public:
	int id;
	string name;
	Student(){
		
	}
	Student(int id,string name){
		this->id=id;
		this->name=name;
	}	
};
int main(){
	Student stu = Student(1,"小高");
	//声明一个map 
	map <int,Student> maps;
	//通过pair插入键值对 
	maps.insert(pair<int,Student>(1,stu));
	//删除一个元素,可以通过键也可以通过迭代器 
	maps.erase(1);
	cout<<maps.at(1).id;
	  map<int, Student>::iterator it; 
    for (it = maps.begin(); it != maps.end(); ++it) {
    	//取出迭代器中的值 
        cout << "Key: " << it->first << " Value: " << it->second.name << endl;
    }
	return 0;
} 

sort排序

#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool compare(int num1,int num2){
	return num1>num2;
}
int main()
{
	//排序
	 vector<int> result={7, 2, 5, 4, 1, 8, 3, 6};
	 //如果不传入compare默认从小到大 
	 sort(result.begin(),result.end(),compare);
	 for(int i=0;i<result.size();i++){
	 	cout<<result[i]<<" ";
	 }
}

string字符串大小写转换

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
    string str = "hello world";
    
    //transform(str.begin(), str.end(), str.begin(),::tolower);
    transform(str.begin(), str.end(), str.begin(),::toupper);
    cout << str << std::endl;
    
    return 0;
}

求最值(返回的是最值的迭代器),二分查找

#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	//二分查找(在排序好的基础上) 
	 vector<int> result={7, 2, 5, 4, 1, 8, 3, 6};
	 sort(result.begin(),result.end());
	 bool flag =binary_search(result.begin(),result.end(),2);
	 //查找最值,返回迭代器可以声明为auto类型 
	 auto min= min_element(result.begin(),result.end()); 
	 auto max= max_element(result.begin(),result.end()); 
	 if(flag){
	 	cout<<"查找成功";
	 	cout<<"最大值是:"<<*max<<"最小值是"<<*min; 
	 }else{
	 	cout<<"查找失败";
	 }
}

全排列

#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
	//注意这里的result必须是已经排列好的 
	 vector<int> result={1,2,3,4};
	 int sum=0;
	 do{
	 	cout<<result[0]<<" "<<result[1]<<" "<<result[2]<<endl;
	 	sum++;
	 }while(next_permutation(result.begin(),result.end()));
	 cout<<sum;
	return 0;
}

堆(优先队列)

这是一种特殊的队列,用二叉树实现的,可以在logn的时间复杂度下,找到最大值(大根堆)或者最小值(小根堆)接下来会给出几个示例告诉我们应该怎么写普通类型和结构体类型的大根堆和小根堆

#include<bits/stdc++.h>
using namespace std;
int main(){
	//默认大根堆 
	priority_queue<int> q;
	//大 less越来越小,就是大 
	priority_queue<int,vector<int>,less<int>> q;
	//小,越来越大,那么第一个值就是最大 
	priority_queue<int,vector<int>,greater<int>> q;
	q.push(1);q.push(2);q.push(3);
	while(!q.empty()){
		cout<<q.top();
		q.pop(); 
	}		
	return 0;
}

对于结构体来说是类似的,关键是要把int类型全部换成结构体类型,然后对结构体类型进行运算符重载

#include<bits/stdc++.h>
using namespace std;
typedef struct node{
	int id;
	int value;
	//less <  greater >  这里是想说大根堆是<,小根堆>
	//关键
	bool operator < (const node &b)const{
		return this->value<b.value;
	}
	node(int id,int value){
		this->id=id;
		this->value=value;
	}
}node; 
int main(){
	//默认大根堆 
	priority_queue<node> q;
	node n1=node(1,1);
	node n2=node(1,2);
	node n3=node(1,3);
	q.push(n1);q.push(n2);q.push(n3);
	while(!q.empty()){
		cout<<q.top().value;
		q.pop(); 
	}		
	return 0;
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值