STL容器介绍以及使用

个人总结如果有错误欢迎指正
什么是容器?如果你学过c语言,那就很简单了,容器就像是数组这种存数据的一种结构,容器在申请的时候也需要指明要存储的数据类型,你只需要通过函数对其插入或者取出数据。

一.近容器

近容器的概念很简单像数组,string这些可以存储数据的结构称为近容器

二.顺序容器

vector

  • vector是向量类型,可以容纳许多类型的数据

  • 进行vector操作前应添加头文件#include

  • 扩容方式按照1.5倍扩容
    初始化方式

  • vector a(10) ; //定义10个整形元素向量,没有初始值,值是随机的;

  • vectora(10,1); // 同上有初始值,都为1

  • vectora(b); //将b中的数拷贝到a中,调用拷贝构造函数

  • vectora(b.begin(),b.end()); //将向量b中从所有元素赋值给a,a的类型为int型

  • vectora(b,b+5); //(int b[8]={0,1,2,3,4,5,6,7})将b中前五个数赋值给a ,注意类型要相同

  • vector a(L.begin(), L.end());用list容器初始化vector容器

#include<vector>
vector<int> a,b;
a.assign(b.begin(),b.begin()+3);//b为向量,将b的0-2个元素赋值给向量a
a.assign(4,2);//a含有4个值为2的元素
a.back();//返回a的最后一个元素
a.front();//返回a的第一个元素
a[i];//返回a的第i元素,当且仅当a存在
a.clear();//清空a中的元素
a.empty();//判断a是否为空,空则返回true,非空则返回false
a.pop_back();//删除a向量的最后一个元素
a.erase(a.begin()+1,a.begin()+3);//删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束
a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5
a.insert(a.begin()+1,5);//在a的第一个元素(从第0个算起)位置插入数值5,
a.insert(a.begin()+1,3,5);//在a的第一个元素(从第0个算起)位置插入3个数,其值都为5
a.insert(a.begin()+1,b+3,b+6);//b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
a.size();//返回a中元素的个数
a.capacity();//返回a在内存中总共可以容纳的元素个数
a.resize(10);//将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10,2);//将a的现有元素个数调整至10个,多则删,少则补,其值为2
a.reserve(100);//将a的容量扩充至100,
a.swap(b);//b为向量,将a中的元素和b中的元素整体交换
a==b;//b为向量,向量的比较操作还有 != >= > <= <
a.max_size();//内存中可以存的当前数据的容量

list

list<int> L;
for (int i = 0; i < 10; i++)
{
	L.push_back(i);//向list中插入数据
}
show_con(L);//打印
vector<int> v1(L.begin(),L.end());//初始化方式
show_con(v1);
L.push_front(3);//头插
L.pop_front();//头删
L.resize(20);//强制改变容器大小,不够申请新空间用0初始化

deque

双端队列 底层实现:二维数组
从中间插入第一个,头插给前面加,尾插后面
扩容:后面需要后面加,前面需要前面加
priority_queue 优先级队列
调用方式同vector

容器适配器

stack:—依赖于deque
queue:—依赖deque
依赖于栈和队列的性质

关联容器

set 集合

自动排序数据有序增删改查时间复杂度低 不允许数据重复
(自己的find算法快——底层红黑树)

set<int> s;
	s.insert(56);//插入
	s.insert(78);
	s.insert(34);
	s.insert(28);
	s.insert(97);
	s.insert(97);
	s.erase(97);//删除
	count(n);在中出现几次01
	s.find(99);找出s中有没有99

multiset 多重集合(类似于set,可以数据重复)

count(n);在中出现几次

map(键值对)

映射表 数据按照key有序
底层实现:红黑树
重复:不允许重复
make_pair()是函数模板,返回的是 类模板对象
it->first 键
it->second 值
查找:map<int,string>::iterator it=mm.find(51);只能按照键找

map<int, string>  mm;
	mm.insert(make_pair(1, "aaaa"));
	mm.insert(make_pair(3, "ccc"));
	mm.insert(make_pair(5, "eeee"));
	mm.insert(make_pair(2, "bbb"));
	mm.insert(pair<int, string>(4, "ddd"));

	map<int, string>::iterator it = mm.begin();
	for (; it != mm.end(); it++)
	{
		cout << it->first << "--->";
		cout << it->second <<endl;
	}
	map<int, string>::iterator it1 = mm.find(5);
	if (it1 != mm.end())
	{
		cout << it1->first << "--->";
		cout << it1->second << endl;
	}
	mm.empty();//判空
	mm.clear();//清除
	//mm.swap();
	mm.erase(5);//删除
	mm.count(5);查找有几个
	mm.size();//获取大小

multimap:多重映射表

重复:允许键值对重复

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值