2022.12月12基础学习

//算法学习之STL学习
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<deque>
#include<set>
#include<map>
#include<unordered_map>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<ctime>


using namespace std;

//STL学习
int main()
{
	//vector 动态可变长数组 学习
	//声明
	vector<int> a;
	vector<int> b[150];//创建了包含150元素的数组,每个元素是一个vector容器,相当于矩阵
	struct zbg
	{
		int x, y;
	};
	vector<zbg> c;
	//插入和删除
	a.push_back(5);//尾插
	a.pop_back();//尾删
	//元素的提取
	a.front();//首元素
	a.back();//尾元素
	//元素大小和判空
	a.size();
	a.empty();
	//迭代器
	vector<int>::iterator first = a.begin(), last = a.end();
	//获得a的首尾迭代器
	a.clear();//清空a的所有元素

	//queue和priority_queue  队列  学习
	//声明
	queue<int> q;
	//插入和删除
	q.push(2);//入队咧
	q.pop();//出队列
	//元素提取
	q.front(); q.back();
	//基本
	q.empty(); q.size();

	//pair  二元组  学习
	pair<string, int> min;//带默认值的初始化
	pair<string, int> max("zbg", 1);//赋初始值
	min = make_pair("zbg", 1);//调用函数初始化,make_pair生成一个pair临时对象
	min.first; min.second;//元素获取,数据成员,不是函数
	//比较运算符
	min == max;//当且仅当两个分别相等
	min < max;//小于运算 只比较第一个

	//优先级队列学习 priority_queue 二叉堆 默认为大根堆
	//声明
	priority_queue<int> z;
	priority_queue<zbg> z1;
	priority_queue<pair<int, string>> z2;//二元组优先级队列
    //插入和删除
	z.push(5);//堆插入
	z.pop();//删除堆顶
	//元素提取
	z.top();
	z.size(); z.empty();//基本函数
	
	//大根堆转换成小根堆
	//1.正整数和正小数转换为负数存储
	//2.创建结构体,对小于运算符重载
	struct Int {
		int x;
		Int(const int& a) : x(a) {}
		bool operator<(const Int& a)
		{
			return x> a.x;
		}
	};
	priority_queue<Int> z0;//int类型的小根堆


	//双端队列学习  deque 两端都有口
	deque<int> j;
	//插入和删除
	j.push_back(1);//尾插
	j.pop_back();//尾删
	j.push_front(3);//头插
	j.pop_front();//头删
	//特殊功能
	j[0];//下标运算符类似数组
	//基本
	j.size(); j.empty(); j.clear();
	//迭代器
	typename deque<int>::iterator deque_first = j.begin(), deque_last = j.end();


	//有序非重复集合  set 和有序重复集合 multiset  底层实现为红黑树,会自动排序
	//声明
	set<int> s; multiset<int> ms;
	//自定义结构体时候要重载小于运算符
	//基本
	s.size(); s.empty(); s.clear();
	ms.size(); ms.empty(); ms.clear();
   
	//中序迭代器 只提供了前++ 和前--的操作(双向访问迭代器,只能左右不能随机)
	typename set<int>::iterator set_first = s.begin(), set_last = s.end();
	--set_first; *set_first;

	//插入和删除
	s.insert(1); s.erase(s.begin());
	ms.insert(1); ms.erase(s.begin());
	s.erase(s.begin());//删除,元素和迭代器都可以,元素会删除全部,迭代器只是一个

	//其他特殊函数
	s.find(2);//查找函数,返回迭代器
	s.lower_bound(2);//查找>=2的最小的一个,返回迭代器
	s.upper_bound(2);//查找>2的最小的一个,返回迭代器
	s.count(2);//返回s中元素2的个数



	//映射<key,value>的二元映射 map和multimap 前者不允许重复,后者可以 底层是红黑树
	//声明,常用做(伪)哈希表
	map<int, int> ma;//自定义结构体要重载小于运算符

	//基本
	ma.size(); ma.empty(); ma.clear();
	ma.begin(); ma.end();//双向迭代器,begin,end仍是前闭后开的范围

	//迭代器 返回值是二元组pair
	typename map<int, int>::iterator map_first = ma.begin();

	//插入和删除
	pair<int, int> mac(5, 1);
	ma.insert(mac); ma.insert(make_pair(5,2));//插入参数为pair二元组
	ma.erase(ma.begin());

	//其他操作
	ma.find(5);//返回迭代器
	//索引运算符重载
	ma[5] = 3;//对关键码5进行改写,没有就创建
	//也可以直接查找
 
   

	//哈希表 unorder_map 底层是哈希表实现
	//声明
	unordered_map<string,int> uma;
	//基本跟map差不多
	uma.insert(make_pair("zbg",1));
	uma.insert(pair<string, int>("npc", 1));//隐式转换
	uma.insert(unordered_map<string, int>::value_type("npc", 1));//非隐式转换
	uma.erase(uma.end());


	//栈 stack
	stack<int> sta;
	//基本
	sta.size(); sta.empty();

	//插入删除
	sta.push(1);//入栈
	sta.pop();//出栈
	sta.top();//栈顶元素引用
	

	//bitset 一个多位二进制数
	bitset<100> abs;

	//位运算操作符
	~abs;//按位取反
	 // & |  ^ 与 或 异或

	//其他
	abs[5];//第六位
	abs.count();//返回有多少个1
	abs.any(); abs.none();//none在全为0为true,any在至少有一个为1为true
    
	//都接受参数
	abs.set();  abs.set(2,1);//都设为1 或者改变某一位
	abs.reset(); abs.reset(1);//都变成0,或者把某一位变成0
	abs.flip(); abs.flip(1);//都按位取反,某一位按位取反



	//algorithm容器算法内容
	vector<int> wj;
	reverse(wj.begin(),wj.end());//容器翻转
	unique(wj.begin(), wj.end());//去重,返回尾指针
	//运用,求个数
	int n = wj.end() - unique(wj.begin(), wj.end());
	random_shuffle(wj.begin(), wj.end());//随机打乱,用法跟reverse相同
	next_permutation(wj.begin(), wj.end());//求字典序下一个排列,并且直接在原容器上更新,不存在就返回false

	sort(wj.begin(), wj.end());//排序函数
	//排序结构体时需要重载小于运算符或者自定义比较函数
	 bool cmp(int a, int b)
	{
		return a < b;
	}
	 sort(wj.begin(), wj.end(), cmp);
	//下面两个函数都返回元素位置迭代器
	 lower_bound(wj.begin(), wj.end(), 5);//二分查找第一个大于等于5的元素
	 upper_bound(wj.begin(), wj.end(), 5);//二分查找第一个大于5的元素


	//产生随机数
	 cout << RAND_MAX << endl;//32767 整数常量
	 srand((unsigned int)time(0));//没有这个函数就是伪随机,rand函数每次的值相同
	 cout << rand() % 10 << endl;
	 cout << rand() % 100 << endl;	//取值范围 0~99
	 cout << rand() % 100 + 1 << endl;	//取值范围 1~100
	 cout << rand() % 30 + 1985 << endl; //取值范围 1985~2014
	 /*随机数模板
	 #include<iostream>
	 #include<cstdlib>
	 #include<ctime>
	 
	 using namespace std;

	 int random(int n)//生成一个0~n-1的随机数
	 {
	     return (long long)rand()*rand()%n;
	 }
	 int main()
	 {
	    srand((unsigned int)time(0));//没有这个函数就是伪随机,rand函数每次的值相同
		...
		..
		.
	 }
	 */

	//提高cin,cout效率
	//ios::sync_with_stdio(false);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值