C++标准模板库(STL)

本文详细介绍了C++标准模板库(STL),包括动态数组vector、集合set、映射map、栈stack、队列queue的定义、访问方式及常用函数。同时,阐述了algorithm库中的max()、min()、swap()等函数,以及排序和二分查找等操作的应用。
摘要由CSDN通过智能技术生成

C++标准模板库(STL)

组件描述
容器容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 queue、list、vector、map 等。
算法算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
模板库迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

1.动态数组vector

需要引用头⽂件vector

定义
//(1)直接定义长度为len的int数组
vector<int> v(len);

//(2)直接定义长度为len,初始值为n的int数组
vector<int> v(len,n);

//(3)先定义一个vector,再用resize调整长度为len
vector<int> v;
v1.resize(len);

//(4)二维都可变的二维数组
vector<vector<int> > vi; 

//(5)一维可变一维定长的二维数组
vector<int> vi[100]; 
访问内容
//(1)与普通数组相同,直接访问下标
v[1] = 2;

//(2)使用迭代器iterator
 //vector<int>::iterator可用auto代替
 //begin()指向第一个元素,rbegin()指向最后一个元素,end()指向最后元素后一个元素
 for (vector<int>::iterator it = c.begin(); it != c.end(); it++) { 
 // it是地址,需要使用*对其取值,支持*(it+i)访问
 cout << *it << " ";
 }
常用函数
//push_back()
//在vector后面添加一个元素, 时间复杂度为O(1)
vi.push_back(x);

//pop_back()
//用以删除vector的尾元素,时间复杂度为O(1)
vi.pop_back(x);

//int size()
//用来获取vector中元素的个数,时间复杂度为O(1)
vi.size();

//clear()
//用来清空vector中的所有元素,时间复杂度为O(N),N为vector中元素的个数
vi.clear();

//insert()
//用来向vector的任意迭代器it处插入一个元素x, 时间复杂度为O(N)
vi.insert(it, x);

//erase()
	//1.删除单个元素
	vi.erase(vi.begin()+3);

	//2.删除一个区间内的所有元素
	//erase(first, last)删除[first, last)内的所有元素
	vi.erase(vi.begin() + 1, vi.begin() + 4);   //删除vi[1] vi[2] vi[3]
	//删除vector内所有元素可以用vi.erase(vi.begin(), vi.end())

2.集合set

set是内部从升序且不含重复元素的集合。
另有unordered_set是无序的集合。

定义
//(1)直接定义int集合
set<int> s;

//(2)定义集合数组
set<int> s[100];
访问内容
 //只能使用迭代器iterator
 //set<int>::iterator可用auto代替
 for (set<int>::iterator it = s.begin(); it != s.end(); it++) { 
 // it是地址,需要使用*对其取值,不支持*(it+i)访问
 cout << *it << " ";
 }
常用函数
//int size()
//用来获取set中元素的个数,时间复杂度为O(1)
si.size();

//clear()
//用来清空set中的所有元素,时间复杂度为O(N),N为set中元素的个数
si.clear();

//insert(x)
//用来向set中插入元素, 时间复杂度为O(logN)
si.insert(x);

//find(x)
//返回set中对应值为x的迭代器,时间复杂度为O(logN)
si.find(x);

//erase()
	//1.删除单个元素
	si.erase(x);  //查找x后进行删除,O(logN)
	st.erase(st.find(x));    //利用find()找到x,然后用erase删除  O(1)
	//2.删除一个区间内的所有元素
	//erase(first, last)删除[first, last)内的所有元素
	vi.erase(vi.begin(), vi.end());   //删除set内所有元素

3.映射map

map是键值对,键和值可设定为任意基本类型,内部依键的大小升序。
另有unordered_map是无序的映射。

定义
map<string,int> m; //定义一个键为string字符串,值为int的映射map
访问内容
//(1)通过键key直接访问
 m["hello"] = 2; // 将key为"hello", value为2的键值对(key-value)存⼊map中
 cout << m["hello"] << endl; // 访问key为"hello"的value, 如果key不存在,则返回0

//(2)使用迭代器iterator,键⽤it->first获取,值⽤it->second获取
 for (auto it = m.begin(); it != m.end(); it++) {
 cout << it->first << " " << it->second << endl;
 }
 
常用函数
//find()
//find(key)返回键为key的映射的迭代器   O(logN)
 map<char, int>::iterator it = mp.find('b');
 printf("%c %d\n", it->first, it->second);

//erase()
//1.删除单个元素    
mp.erase(it);     //O(1)
mp.erase('b');    //O(logN)
//2.删除一个区间内所有元素
mp.erase(first, last);   //删除[first, last)

//int size()
//用来获取map中映射的对数     O(1)
mp.size();

//clear()     O(N)
mp.clear();

4.栈stack

数据结构,后进先出

定义
stack<int> s; //定义一个空栈
访问内容
s.top();  //只能访问栈顶元素
常用函数
//push()
//将x压入栈
s.push(x);

//pop()
//将栈顶元素移出栈
s.pop();

//int size()
//用来获取栈中元素个数

//bool empty()
//判断栈是否为空

5.队列queue

数据结构,先进先出

定义
queue<int> q; //定义一个队列
访问内容
//只能访问队首和队尾元素
q.front();  
q.back();  
常用函数
//push()
//将x压入队
q.push(x);

//pop()
//将队首元素移出队
q.pop();

//int size()
//用来获取队列中元素个数

//bool empty()
//判断队列是否为空

6.algorithm中的函数

max(), min()

最大值 最小值

swap(x,y)

交换x和y

reverse(a,b)和reverse_copy(a,b,s)

反转数组中[a,b)区间的元素,(复制到s中)

fill(a,b,n)

将数组中[a,b)区间赋值为任意值n,与memset()不同(只能赋值0和-1)

sort(a,b,[cmp])

将数组[a,b)区间按照函数cmp(不设置则默认从小到大)的规则进行排序
只有数组,vector, string, deque可以使用sort

bool cmp(int a, int b) { // cmp函数返回的值是bool类型
 return a > b; // 从⼤到⼩排列
}

int main() {
	vector<int> v(10);
 	for (int i = 0; i < 10; i++) {
		cin >> v[i];
 	}
	sort(v.begin(), v.end(), cmp);// arr从⼤到⼩排列,因为cmp函数排序规则设置了从⼤到⼩排序
	 return 0;
}
lower_bound 、 upper_bound和binary_search函数

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。
返回的是最先出现的位置

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。
返回的是最后出现的位置

参数begin和end还有返回值都是地址

binary_search( begin,end,num):回的是是否存在这么一个数,是一个bool值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值