STL常见容器知识的整理 持续更新中

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值