各种容器
这些都是C++的
1.vector,动态数组
使用要包括头文件
#include<vector>
vector 的基本操作有:
定义一个vector:vector<容器存的类型(可以是结构体)> v(这个容器的名称);
判断是否空:v.empty(); //为空则返回真
从尾部插入数据:v.push_back(a);//a指数据
从中间插入数据: v.insert(v.begin()+i,a);//在第i+1个元素前面插入a;
要访问里面的元素,和数组一样,v[0],v[1];
vector的大小:v.size();
要删除数据: v.pop_back() //删除最后一个
v.erase(v.begin()+i);//删除第i+1个元素
v.erase(v.begin()+i,v.end()+j);//删除区间[i,j-1];
清空vector:v.clear();
对vector进行排序:sort(v.begin(),v.end(),cmp);可以直接用sort函数,或者加cmp比较条件
将元素翻转,即逆序排列:reverse(vec.begin(),vec.end());//也要#include
begin()与end()函数、front()与back()的用法
front(),back()就是第一个和最后一个元素,begin(),end()是首位地址;
vector<char> v1;
vector<char>::iterator iter1;
vector<char>::iterator iter2;
v1.push_back('m');
v1.push_back('n');
v1.push_back('o');
v1.push_back('p');
cout << "v1.front() = " << v1.front() << endl;
cout << "v1.back() = " << v1.back() << endl;
iter1 = v1.begin();
cout << *iter1 << endl;
iter2 = v1.end()-1; //注意v1.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素
//的正确操作为:v1.end() - 1;
cout << *iter2 << endl;
输出结果:
v1.front() = m
v1.back() = p
m
p
2.stack,栈;
存放图
包括头文件:
#include<stack>
stack 的基本操作有:
定义一个stack:stack<容器存的类型(可以是结构体)> v(这个容器的名称);
判断是否空:v.empty(); 堆栈为空则返回真
删除元素:v.pop(); 移除栈顶元素
增加元素:v.push(x); 把x加入栈顶元素
stack大小:v.size(); 返回栈中元素数目
要最上面的元素:v.top(); 返回栈顶元素
3,queue,队列fifo
存放图
注意:队列不可以用sort
先进先出,在bfs的时候需要用
包括头文件:
#include <queue>
queue 的基本操作有:
定义一个queue:queue<容器存的类型(可以是结构体)> v(这个容器的名称);
入队,如例:v.push(x); 将x 接到队列的末端。
出队,如例:v.pop(); 弹出队列的第一个元素。
访问队首元素,v.front(); 即最早被压入队列的元素。
访问队尾元素,v.back(); 即最后被压入队列的元素。
判断队列空,v.empty(); 当队列空时,返回true。
访问队列中的元素个数v.size();
还有一个双向队列deque
用法相似,但是他是可以从两头进两头出
push_front(x):双端队列头部增加一个元素X
push_back(x):双端队列尾部增加一个元素x
pop_front():删除双端队列中最前一个元素
pop_back():删除双端队列中最后一个元素
clear():清空双端队列
4.优先队列
优先队列是你设定好判断条件后,在加入元素的时候就会自动排序,可以有相同的元素,(这点和map不一样)
这种操作同queue
此处指的基本数据类型就是 int 型,double 型,char 型等可以直接使用的数据类型,优先队列对他们的优先级设置一般是数字大的优先级高,因此队首元素就是优先队列内元素最大的那个(如果是 char 型,则是字典序最大的)。
//下面两种优先队列的定义是等价的
priority_queue<int> v;
priority_queue<int,vector<int>,less<int> > v;//后面有一个空格
其中第二个参数( vector ),是来承载底层数据结构堆的容器,第三个参数( less ),则是一个比较类,less 表示数字大的优先级高,而 greater 表示数字小的优先级高。
由小到大
priority_queue<int,vector<int>,greater<int> >v;
结构体的排序
struct node {
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //结构体中,x小的优先级高
//不难理解,定义的是小于号,而返回的是x大的就是真,说明x越大 就越小
}
};
priority_queue<node> v; //定义方法
操作:
返回最前面的歌:v.top();
弹出最前面的:v.pop();
压入队列:v.push(x);
判断是否空:v.empty();
返回元素数目:v.size();
5.map
map是一种映射关系,有两个东西,一个是关键字,一个是值,它是按照关键字排序的顺序
要包括头文件#include<map>
定义map :map<int,string> v;//在这里是以第一个来排序的,映射值是string,都是以第一个为关键字,这两种是可以换的
插入元素:v.insert(make_pair(key,value));//key和value都是类型名
查找或者遍历的时候要用一个迭代器:map<key,value>::iterator it;//it是迭代器名称
遍历的方法:for(it i:v) cout<<i.first<<" "<<i.second;
查找某一个key值有没有出现:it=v.find(x);//x是查找的x值
如果找到了,那么它的就变成那个元素,负责就变成v.end()也就是空;
第一个值是it->first,第二个值是it->second;
容器里的头元素是v.begin();
容器的尾巴是v.end();