《算法基础课》第二章节 STL容器介绍
《算法基础课》第二章节 STL容器介绍
1.Vector
1.1 介绍
vector是变长数组,数组长度可以动态地变化,基本思想是倍增的思想:vector自动变长,但由于C++的特点,当系统为某一个程序分配空间时,所需的时间基本上与空间大小无关,与申请次数有关,所以变长数组要尽量减少申请次数
1.2 定义方式
vector<int> a; //定义vector
vector<int> a(N,X); //定义vector使其长度为N,每一个元素为X
vector<int> a[10]; //定义vector数组(10个vector)
1.3 支持函数
a.size() //返回vector里元素个数 时间复杂度为O(1)
a.empty() //判断vector是否为空,空返回True,非空返回False
a.clear() //清空vector
a.front() //返回第一个数
a.back() //返回最后一个数
a.push_back() //向vector最后插入一个数
a.pop_back() //把vector最后一个数删掉
a.begin() //迭代器,vector的第0个数
a.end() //迭代器,vector最后一个数的后面一个数
1.4 其他
- 遍历方法(三种)
//方法一:直接遍历
for(int i=0;i<a.size();i++) cout<<a[i]<<' ';
cout<<endl;
//方法二:迭代器(可以看成指针)
for(vector<int>::iterator i=a.begin();i!=a.end();i++ ) cout<<*i<<' ';
//a.begin()其实就是a[0] a.end()其实就是a[a.size()]
//其中vector<int>::iterator可以直接写成auto
//auto是C++的关键字,可以让系统自动推断类型的关键字,当类型名较长时写auto会特别省事
//方法三:C++的范围遍历,C++使用的一种新的语法,代码会短一些,效率会快一些
for(auto x:a) cout<<x<<' ';
- 黑科技
vector支持比较运算,vector可以按照字典序进行比较运算,如vectora(4,3),b(3,4)中,a<b
2.Pair
2.1 介绍
pair的作用是存储一个二元组,前后两个变量类型是任意的,假设某一个东西有两种不同的属性,我们就可以用pair来存,也可以用来存储三个属性,可以看成帮我实现了一个结构体,并且自带了比较函数
2.2 定义方式
pair<int,string> p;
pair<int,pair<int,int>> p; //存储三个属性
//初始化
p=make_pair(10,"yzl");
p={10,"yzl"}
2.3 支持函数
p.first //取第一个元素
p.second //取第二个元素
2.4 其他
- 支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
3.String
3.1 介绍
string其实是C++把字符串进行了封装,用string来存很方便
3.2 定义方式
string s;
string s="abc"; //定义字符串
3.3 支持函数
s.size();
s.empty();
s.clear();
s.length(); //返回字符串长度,与size作用相同
s.substr(st,l); //返回子串,从下标st开始返回长度为l的子串
//当l省略时,直接返回从下标st开始的整个子串
//当l长度过大,超过字符串本身时,就会输出到字符串结尾为止
s.c_str(); //返回string s存储字符数组的起始地址
printf("%s\n",a.c_str());
3.4 其他
- 字符串的添加
string a="abc";
a+="def"; //添加一个字符串
a+='g'; //添加字符
此时a的内容为abcdefg
4.Queue
4.1 介绍
队列
4.2 定义
queue<int> q;
q=queue<int>();
4.3 支持函数
q.size();
q.empty();
//无clear函数,若想清空,可以重新构造一个队列
q.push() //向队尾插入一个元素
q.front() //返回队头元素
q.back() //返回队尾元素
q.pop() //弹出队头元素
5.Priority_queue
6.Stack
6.1 介绍
栈
6.2 定义
stack<int> stk;
6.3 支持函数
stk.size();
stk.empty();
//无clear函数
stk.push() //向栈顶插入一个元素
stk.top() //返回栈顶元素
stk.pop() //弹出栈顶元素
7.Deque
8.Set
8.1 介绍
set分为set和multiset,set不能有重复元素,multiset可以有重复元素
8.2 支持函数 (复杂度都为O(logn))
set.size();
set.empty();
set.clear();
set.begin();
set.end(); //支持++,--操作,返回前驱和后继
set.insert(); //插入一个数
set.find(); //查找一个数,若不存在返回end迭代器
set.count(); //返回某一个数的个数
set.erase(); //删除操作
set.erase(x); //输入一个数,删除所有x; O(k+logn);
set.erase(迭代器); //输入一个迭代器,删除这个迭代器
set.lower_bound(x); //返回大于等于x的最小的数的迭代器
set.upper_bound(x); //返回大于x的最小的数的迭代器
9.Map
9.1 介绍
可以像用数组一样使用map,但时间复杂度为logn
9.2 定义
map<string,int> a;
a["yzl"]=1;
cout<<a["yzl"]<<endl;
9.3 支持函数
map.size();
map.empty();
map.clear();
map.begin();
map.end(); //支持++,--操作,返回前驱和后继
map.insert(); //插入的是一个pair
map.erase(); //输入的参数是pair或者迭代器
map.find();
map.lower_bound(x); //返回大于等于x的最小的数的迭代器
map.upper_bound(x); //返回大于x的最小的数的迭代器