基础语法——STL容器、常用库函数

本文概述了C++中的几种基本数据结构,包括Vector(动态数组)、queue(队列)、stack(栈)、deque(双端队列)、set(有序集合)及其多态版本、map(键值对映射)以及unordered_set和unordered_map(哈希表)。介绍了它们的特点、操作方法和常见用法。
摘要由CSDN通过智能技术生成

一、Vector

Vector是变长数组,支持随机访问,不支持在任意位置O(1)插入,为了保证效率,元素的增删一般应在末尾进行。

#include<iostream>
#include<vector> //头文件 
using namespace std;
struct rec{
		int x,y;
	}; //自定义结构体 
int main(){
	vector<int> a; //定义一个长度动态变化的int数组 
	vector<int> b[233]; //定义一个第一位长度233,第二维长度动态变化的int数组 
	vector<rec> c; //自定义结构体类型也可以保存在vector中 
	a.size(); //返回数组实际大小,O(1) 
	a.empty(); //返回一个bool值,表示数组是否为空,O(1) 
	a.clear(); //清空数组中的值,O(1)
	vector<int>::iterator it = a.begin(); //定义一个迭代器,迭代器可以看成指针 
	vector<int> a({1,2,3}); //vector数组初始化 
	for(int i = 0;i = a.size();i ++ ){
		cout << a[i] << " ";
	} //一、数组方式遍历vectore数组
	for(vector<int>::iterator i = a.begin();i < a.end();i ++ ){
		cout << *i << " ";
	} //二、迭代器方式遍历vector数组
	for(int x : a){
		cout << x <<" "; 
	} //三、范围遍历 
	cout << a.front() << a[0] << *a.begin(); //三种方法一样,返回数组第一个元素 
	cout << a.back() << a[a.size() - 1]; //两种方法一样,返回数组最后一个元素 
	a.push_back(4); // 尾插,O(1)
	a.pop_back //删除最后一个元素,O(1) 
	return 0;
}

二、queue 

头文件queue主要包括循环队列queue和优先队列priority_queue两个数据结构

queue(队列)先进先出

#include<queue> //头文件 

using namespace std;

int main(){
	queue<int> a; //定义一个整型队列 
	queue<double> a; //定义一个浮点型队列 
	struct Rec{
		int a,b;
	};
	queue<Rec> a; //定义一个结构体队列
	a.push(1); //在队首插入一个元素 
	a.pop(); //弹出队尾元素 
	a.front(); //返回队首 
	a.back(); // 返回队尾 
	priority_queue<int> a; //定义一个大根堆:每次取最大值 
	priority_queue<int,vector<int>,greater<int>> a; //定义一个小根堆,每次取最小值 
	struct Rec{
		int a,b;
		bool operator< (const Rec& t) const{
		return a < t.a;
		}
	}; //定义结构体类型的大根堆优先队列需要重载小于号 
	priority_queue<Rec> a; //定义结构体类型的优先队列 
	priority_queue<pair<int,int>> a; //定义二元组优先队列 
	a.push(1); //插入一个数 
	a.top(); //弹出优先队列的顶部元素 
	a.pop(); //输出优先队列的顶部元素但不会删除它
    a.empty(); //检查优先队列是否为空
    a.size(); //返回优先队列中元素的数量
	return 0;
}

三、stack

stack(栈)先进后出

#include<iostream>
#include<stack> //头文件 

using namespace std;

int main(){
	stack<int> stk; //定义一个栈 
	stk.push(); //栈顶插入 
	stk.top(); //弹出栈顶元素 
	stk.pop(); //删除栈顶元素 
	return 0;
}

四、deque

deque(双端队列)是一个支持在两端高效插入和删除元素的线性空间,像是vector和queue的结合,与vector相比deque在头部增删元素只需O(1)的时间,与queue相比,deque可以像数组一样支持随机访问

#include<iostream>
#include<deque> //头文件 

using namespace std;

int main(){
	deque<int> a;
    a[1]; //随机访问
	a.begin(); //返回deque的头迭代器 
	a.end(); //返回deque的尾迭代器 
	a.front(); //从队首入队 
	a.back(); //从队尾入队 
	a.pop_front(1); //从队首出队 
	a.pop_back(1); //从队尾出队 
	a.clear(); //清空队列 
	return 0;
}

五、set

头文件set主要包括set(有序集合)和multiset(有序多重集合)两个容器,即前者的元素不能重复,而后者可以包含若干个相等的元素。set和multiset的内部实现是一棵红黑树,他们支持的函数基本相同。

#include<iostream>
#include<set> //头文件 

using namespace std;

int main(){
	set<int> a; //元素不能重复
	multiset<int> b; //元素可以重复
	set<int>::iterator it = a.begin(); //定义迭代器 
	a.begin(); //返回第一个元素的迭代器,O(1) 
	a.end(); //返回a最后一个元素的后一个位置的迭代器,O(1) 
	a.insert(x); //插入x,O(logn)
	a.find(x); //查找x,返回迭代器,如果没有x,返回a.end(),O(logn)
	a.lower_bound(x); //二分找到大于等于x的最小的元素的迭代器,O(logn)
	a.upper_bound(x); //二分找到大于x的最小的元素的迭代器,O(logn)
	a.erase(x); //删除一个元素或者迭代器,O(logn)
	a.count(x); //集合中x的个数,O(logn)
	struct Rec{
		int a,b;
		bool operator< (const Rec& t) const{
		return x < t.x;  //重载小于号 
		}
	}; 
	set<Rec> c;
	return 0;
}

size/empty/clear 与vector类似、

set中的方法multiset都可以使用

六、map

map容器是一个键值对key—value的映射,其内部实现是以一棵以key为关键码的红黑树,map的key和value可以是任意类型,其中key必须定义小于号运算符

#include<iostream>
#include<vector>
#include<map> //头文件 

using namespace std;

int main(){
	map<string,vector<int>> a;
	a["lxy"] = vector<int>({1,2,3,4});
	cout << a["lxy"].size();
	
	return 0;
}

size/empty/clear/begin/end均与set类似

七、unordered_set、unordered_map

#include<iostream>
#include<vector>
#include<unordered_set> //头文件 
#include<unordered_map> //头文件 
using namespace std;

int main(){
	unordereded_set<int> a; //哈希表,不能存储重复元素 
	unordered_multiset<int> b; //哈希表,可以存储重复元素 
	
	unordered_map<int,int> c; //哈希表
    c.insert({x,y}); //插入键x值y
    c.find(x); //找到键x,存在返回键x对应值的迭代器,不存在则返回end()迭代器
    c.end() //返回一个迭代器,指向哈希表的末尾位置
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

还好我是c语言大佬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值