C++的STL库用法

title: C++的STL库用法
date: 2019-05-31 15:23:19
tags: STL

C++的STL库用法

empty()size()所有容器都有,时间复杂度为O(1)
直接有一个变量存储size,直接取出来的

vector 变长数组 倍增的思想

系统为某一个程序分配空间所需的时间 与空间大小无关,与申请次数有关
由此可以知道,vector的优化,主要在于减少申请空间次数

front() 返回第一个数
back() 返回最后一个数
push_back() 向vector的最后插入一个数
pop_back() 向vector的最后删除一个数
有迭代器 begin() vector的第0个数,end() vector的最后一个数的后面一位
支持随机存取 v[i](和数组一样)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> v;
	vector<int> v(10);//定义一个为长度为10的vector
	vector<int> v(10,3);//长度为10,每个数初始化为3
	vector<int> v[10];//定义了10个vector
	v.size();//返回vector中元素个数
	v.empty();//返回vector是否为空
	v.clear();//清空  队列就没有
	
	//三种遍历方式 
	for(int i=0;i<10;i++)
	v.push_back(i);//插入 
	
	for(int i=0;i<v.size();i++)
	cout<<v[i]<<" ";
	
	vector<int>::iterator it;//迭代器
	for(it=v.begin();i!=v.end();i++)
	cout<<(*it)<<" "; 
	
	for(auto x:v)
	cout<<x<<" ";//c++的范围遍历,稍微快一些

	return 0;
}

支持比较运算

	vector<int> a(4,3),b(3,4);
	if(a<b)//按字典序比较的 4个3 小于 3个4 
	printf("Yes\n");
pair 存储一个二元组

pair<int,string> p;
p.first 取得这个pair的第一个元素
p.second 取得这个pair的第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
p=make_pair(2,"abc")p={2,"abc"} 构造一个pair
pair<int,pair<int,int> > p 存储三个属性

string

substr() 返回子串
c_str() 返回string数组对应的头指针
size()empty()clear()

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string s="abc";
	s+="de";
	s+='f';
	cout<<s<<endl;//s=abcdef 
	
	cout<<s.substr(1,2)<<endl;//(起始下标,长度)
	//bc            
	//若第二个参数大于了字符串长度,则输出完字串为止 
	cout<<s.substr(1)<<endl;//bcdef 
	//省略第二个参数则返回从起始下标开始的整个字串
	
	printf("%s",s.c_str());//如果要用%s来输出的话
	//c_str()返回数组起始地址 
	return 0;
}
queue

push() 队尾插入一个元素
front() 返回队头元素
pop() 队首弹出一个元素
back() 取队尾元素
size()empty(),没有clear()
如果想清空一个队列,重新构造一个即可 q=queue<int>();

priority_queue 优先队列 实际是个堆

默认是大根堆
push() 往堆里插入元素
top() 返回堆顶元素
pop() 把堆顶元素弹出
无clear()

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
	priority_queue<int> heap;//默认是大根堆
	//如果我想让它变成小根堆
	//1.插入负数
	heap.push(-x);
	//2.定义成小根堆
	 priority_queue<int,vector<int>,greater<int> > heap;
	return 0;
}
stack 栈

push() 往栈顶添加元素
top() 返回栈顶元素
pop() 弹出栈顶元素
size()empty()
队列 基本差不多

deque 双端队列 队头队尾都可以插入删除,且可以支持随机访问

像是加强版的vector,缺点是比较慢,一般不会用,因为

size()empty()clear()
front()back()
push_back()pop_back()
push_front()pop_front()
begin()end()
[]

基于平衡二叉树(红黑树)来实现,动态维护有序序列

红黑树是平衡二叉树的一种
以下容器都有size()empty()clear()
begin()end()——O(log n) 有++,- -操作,返回前驱和后继

1.set 所有时间复杂度为O(log n) / multiset

find() //查找一个数,不存在就返回迭代器end()
insert() 插入一个数
count() 返回某一个数出现的次数(即 个数)
erase() 有两种用法:
erase(i) 参数是数字i,删除所有等于i的数,时间复杂度O(k+logn),k是i的个数
若参数是一个迭代器,则删除的是这个迭代器
最核心的两个操作:
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器

	set<int> s;//不能有重复元素 
	multiset<int> ms;//可以有重复元素 

2.map / multimap

insert() 插入的数是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 注意 multimap 不支持此操作, 时间复杂度是 O(logn)。(数组直接取下标是O(1)的)
lower_bound()/upper_bound()

基于哈希表来实现 C++里实现的hash

和上面类似,增删改查的时间复杂度为O(1),但不支持 lower_bound()/upper_bound() ,因为内部是无序的
也不支持迭代器的++ - -

1.unordered_set
2.unordered_map
3.unordered_multiset
4.unordered_multimap
bitset 压位  状态压缩

比如,一个整数int ,4个字节,32位
其实我们只需要知道每一位上的数是0是1

c++里的bool数组是一个字节的,如果我们要开一个1024的bool数组
需要 1024Byte ——>1KB 内存
而bitset是在每一位上存8位,比正常的数字省8倍空间
则需 128B 内存

我们如果想存一个10000*10000的bool矩阵,就需要 1 0 8 B y t e = 1 0 5 K B = 100 M B 10^8Byte=10^5KB=100MB 108Byte=105KB=100MB
若题目限制空间位64MB
我们就需要用bitset来存,就只需12M的空间了

头文件#include <bitset>

	bitset<10000> s;//括号内写的是长度,开一个长度为10000的bitset
	~s;//取反操作
	&,|,^  //最后一个是异或
	>>,<<  //支持移位操作 
	==,!= 
	[] //可以取出某一位,看是0是1
	count(); //返回有多少个1 
	any();//判断是否 至少有一个1 
	none(); //判断是否全为0
	set();//把所有位置成1
	set(k,v);//将第k位变成v
	reset(); //把所有位置成0
	flip();//取反,等价于~
	flip(k);//把第k位取反 

测试:

#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main()
{
    bitset<7> bst1;
    bitset<7> bst2;
    cout << "1) " << bst1 << endl; //输出 1) 0000000
    bst1.set(0,1);//将第0位变成1,bst1变为 0000001
    cout << "2) " << bst1 << endl; //输出 2) 0000001
    bst1 <<= 4; //左移4位,变为 0010000
    cout << "3) " << bst1 << endl; //输出 3) 0010000
    bst2.set(2);//第二位设置为1,bst2变成  0000100
    bst2 |=bst1; // bst2变成  0010100
    cout << "4) " << bst2 << endl; //输出 4) 0010100
    cout << "5) " << bst2.to_ulong () << endl; //输出 5) 20
    bst2.flip(); //每一位都取反,bst2变成 1101011
    bst1.set(3); //bst1变成  0011000
    bst2.flip(6); //bst2变成 0101011
    bitset<7> bst3 = bst2^ bst1;//bst3 变成 0110011
    cout << "6) " << bst3 << endl; //输出 6) 0110011
    cout << "7) " << bst3[3] << "," << bst3[4] << endl; //输出 7) 0,1
    return 0;
}

这个博客有相关例题


想知道更多函数使用方法:C++ reference

算法竞赛中 C++ 的 STL 库有哪些奇技淫巧,参见知乎

面向算法竞赛的STL使用教程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值