1.vector
简单说,就是一个不定长数组,而且我们可以通过指针对数组的元素进行删除操作
记住,vector内部也是可以实现有序的,同时可以通过sort对vector进行排序(注意指针用的是迭代器不是数组名)
注意,在加入元素时,如果 vector
拥有的内存空间不足以存放欲加入的元素,则 vector
会申请一块新的内存,并将旧数据拷贝过去,
这个过程通常花费 O(N) 的时间,最好在使用前初始化一下capacity,提高效率。
例如 vector<int> a(n)
vector<int> a(n,value)
vector<int>a(b.begin(),b.begin+3);
int b[7]={1,2,3,4,5,6,7}; vector<int> a(b,b+7);
vector<int>a(b);
内置insert函数被重载多次有以下形式
a.insert(a.begin()+1,5);
a.insert(a.begin()+1,3,5);
a.insert(a.begin()+1,b+3,b+6);//其中b为数组
//合并
vec3.insert(vec3.end(),vec1.begin(),vec1.end());
reverse(a.begin(),a.end());//把a倒置
copy(a.begin(),a.end(),b.begin()+1);//复制到特定位置
vector<vector<int> >a;//可以嵌套使用但是用不了push_back了
vector<vecor<vector<int>> > a;
2.queue
分为queue普通和priority_queue
普通queue是先进先出的这是性质没什么好多的
出列用pop(),入列用push(),取队首用front().
关于优先队列,基本操作的普通队列一样;
就是队列的优先级可以自己调一下,要学会怎么调优先级
常见的就是对node的排序priority_queue在申明的时候可以简写也可以略写
完整形式为priority_queue<基本数据类型,容器类型,比较函数> p;(注p前面最好留一个空格,免得被编译器误认为是>> 右移运算符)
还有就是,node的优先级比较可以写在结构体里边,也就是对某些运算符进行重载(还有一种形式为友元函数的重载现在用的比较熟的就是这种)
也可以写一个成员函数cmp函数在结构体里(这点不太确定稍后确定一下)
priority_queue的重载
struct node
{
int l,int r;
};
struct cmp
{
bool operator ()(node &a,node &b)
{
if(a.l!=b.l) return a.l>b.l;
else return a.r>b.r;
}
};
//结构体外部的重载
priority_queue<node,vector<node>,cmp>que;
//
struct node
{
int l,r;
bool operator < (const node &a)const
{
if(l!=a.l) return l>a.l;
return r>a.r;
}
};
priority_queue<node> que;
//结构体内部的重载
struct node
{
int l,r;
friend bool operator < (node a,node b)
{
if(a.l!=b.l) return a.l<b.l;
return a.r<b.r;
}
};
//当然还有友元函数的重载具体原理自行了解
3.stack
这个用的比较少;我们对栈的操作也可以通过vector进行而且有时似乎更加方便(当然这是在不考虑算法效率的情况下才能这么说)
4.set
内部实现为红黑树,为一个有序容器
而且可以进行嵌套(不知道其他容器支不支持)
set< set<int> >s
set< vector<int> >s
还有可重集multiset
不支持随机访问,可以用迭代器访问 set<int>::iterator it;
常用函数
s.count() 返回查询值得个数没有返回0
s.find()返回查询值得迭代器指针(可重集中不知道怎么算)若不存在返回s.end()
s.erase() 既可以删除值也可以删除指针(迭代器下的指针)
另外,还支持s.lower_bound()求>=某元素的第一个元素,返回的是元素的迭代器,找不到返回s.end()
s.upper_bound()一样
5.map
其内部实现为一颗红黑树,是一个有序的容器,当然有无序版的unordered_map
标准格式为map<键,值>,为键对值得映射
同样不支持随机访问,用迭代器访问
常用函数
count();
find();
erase();可支持迭代器删除和make_paire(key,value)删除
insert(make_pair(key,value));注意插入的键如果已存在,则插入的新键值无效
使用map【what】查找键值时若是不存在这个键系统会自动补上这个键然后映射到0,即map[what]=0(这是因为map重载了运算符[])
unorder_map内部实现为hash表,外部函数什么的调用基本和map没差,由于是无序的查找的时间为o(1),比map快;
注:unordered_map和unordered_set遍历容器是的顺序不一定是按照插入顺序,而是按照hash表的顺序
在devc++中使用类似于unordered_map这一类的容器需要手动添加命令-std=c++11 -std=gnu++11进编译选项中,否则会报错。
6、deque
//双向队列 deque
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
deque<int> ideq(20); //需要提前预判开好,否则会影响效率
deque<int>::iterator pos;
int i;
//使用assign()赋值 assign在计算机中就是赋值的意思
for (i = 0; i < 20; ++i)
ideq[i] = i;
//输出deque
printf("输出deque中数据:\n");
for (i = 0; i < 20; ++i)
printf("%d ", ideq[i]);
putchar('\n');
//在头尾加入新数据
printf("\n在头尾加入新数据...\n");
ideq.push_back(100);
ideq.push_front(i);
//输出deque
printf("\n输出deque中数据:\n");
for (pos = ideq.begin(); pos != ideq.end(); pos++)
printf("%d ", *pos);
putchar('\n');
//查找
const int FINDNUMBER = 19;
printf("\n查找%d\n", FINDNUMBER);
pos = find(ideq.begin(), ideq.end(), FINDNUMBER);
if (pos != ideq.end())
printf("find %d success\n", *pos);
else
printf("find failed\n");
//在头尾删除数据
printf("\n在头尾删除数据...\n");
ideq.pop_back();
ideq.pop_front();
return 0;
}
7、list
一、List定义:
List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。使用时需要添加头文件
二、List定义和初始化:
list<int>lst1; //创建空list
list<int> lst2(5); //创建含有5个元素的list
list<int>lst3(3,2); //创建含有3个元素的list
list<int>lst4(lst2); //使用lst2初始化lst4
list<int>lst5(lst2.begin(),lst2.end()); //同lst4
三、List常用操作函数:
Lst1.assign() 给list赋值
Lst1.back() 返回最后一个元素
Lst1.begin() 返回指向第一个元素的迭代器
Lst1.clear() 删除所有元素
Lst1.empty() 如果list是空的则返回true
Lst1.end() 返回末尾的迭代器
Lst1.erase() 删除一个元素
Lst1.front() 返回第一个元素
Lst1.get_allocator() 返回list的配置器
Lst1.insert() 插入一个元素到list中
Lst1.max_size() 返回list能容纳的最大元素数量
Lst1.merge() 合并两个list
Lst1.pop_back() 删除最后一个元素
Lst1.pop_front() 删除第一个元素
Lst1.push_back() 在list的末尾添加一个元素
Lst1.push_front() 在list的头部添加一个元素
Lst1.rbegin() 返回指向第一个元素的逆向迭代器
Lst1.remove() 从list删除元素
Lst1.remove_if() 按指定条件删除元素
Lst1.rend() 指向list末尾的逆向迭代器
Lst1.resize() 改变list的大小
Lst1.reverse() 把list的元素倒转
Lst1.size() 返回list中的元素个数
Lst1.sort() 给list排序
Lst1.splice() 合并两个list
Lst1.swap() 交换两个list
Lst1.unique() 删除list中重复的元素
8、biset
这是标准库里的一个类,可以直接通过头文件调用。
首先可以通过biset<length>指定它的长度,然后这个类重载了【】运算符,可以直接通过数组调用,很方便的实现了特位的运算。
也有count函数,直接返回1的个数。
其实通过普通数组就能简单实现,但是直接呈现的调用类能少写几行代码。
持续更新中。。。有什么宝贵意见欢迎提出
参考资料:https://blog.csdn.net/fanyun_01/article/details/56881515