STL模板库中常用的容器

一、C++中容器类型
C++中有两种类型的容器:顺序容器和关联容器
顺序容器主要有vector、list、deque等
关联容器主要有map和set
注意:容器类自动申请和释放内存,因此无需new和delete操作

二、迭代器
类似于专门用来指向容器成员的指针,用来遍历、操作、管理容器中的成员,可以大大提高对容器的访问速度
用法:容器类名<>::iterator 迭代器名
*迭代器名就表示迭代器指向的元素,可以当做指针来用,但其实是类对象
begin() :获取指向第一个元素的迭代器
end() :获取指向最后一个元素的下一位置的迭代器
举个例子:

#include <iostream>
#include <list>

using namespace std;

void show(list<int>& l)
{
	list<int>::iterator it;
	for(it=l.begin();it!=l.end();it++)
	{
		cout << *it << endl;
	}
}

int main()
{
	list<int> l;
	for(int i=0;i<10;i++)
	{
		l.push_back(i);
	}

	show(l);

    return 0;
}

三、vector
1、vector:向量容器,其实就是可变长的动态数组
2、基本的一些成员函数
在这里插入图片描述例子:

#include <iostream>
#include <vector>

using namespace std;
void show(vector<int>& arr)
{
	for(int i=0; i<arr.size(); i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

int main()
{
	// 创建向量,设置容量并初始化
	vector<int> arr(20,0);
	show(arr);

	// 向量支持[]运算符,所以被称为数组
	for(int i=0; i<10; i++)
	{
		arr[i] = i;
	}
	show(arr);

	vector<int> arr1(10,0);
	// 支持比较运算符
	cout << (arr[0]==arr1[0]) << endl;

	// at成员函数,相当于[]操作
	for(int i=0; i<arr.size(); i++)
	{
		cout << arr.at(i) << endl;
	}

	// 获取向量的容量
	cout << arr.capacity() << endl;
}

四、list
1、list:双端链表容器,即每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素,与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢
2、基本的一些成员函数
在这里插入图片描述
例子:

#include <iostream>
#include <list>

using namespace std;

//遍历输出链表
void show(list<int>& l)
{
	//逆向迭代器
	list<int>::reverse_iterator it;
	for(it=l.rbegin();it!=l.rend();it++)
	{
		cout << *it << endl;
	}
}

int main()
{
	//创建链表
	list<int> l;
	//使用数组对链表进行初始化
	int arr[5] = {11,22,33,44,55};
	l.assign(arr,arr+5);

	for(int i=0;i<10;i++)
	{
		//尾部添加元素
		l.push_back(i);
		//头部添加
		//l.push_front(i);
	}
	//链表逆序
	l.reverse();
	//链表排序,默认升序,但是链表中的元素必须支持比较运算,否则要提供比较函数
	l.sort();

	//创建另外一个链表
	list<int> l1;
	l1.assign(arr,arr+5);

	//合并两个链表,被合并的链表(l1)就不存在了
	l.merge(l1);

	//判断链表是不是空链表
    cout << (l1.empty() ? "空" : "非空") << endl; 
	
	//输出链表的最大容量
	cout << l.max_size() << endl;
	
	for(int i=0;i<5;i++)
	{
		//尾部删除元素
		l.pop_back();
		//头部删除元素
		//l.pop_front();
	}

	//删除值为55的元素
	l.remove(55);
	
	show(l);
}

注意:当容器中的元素被删除后,之间获取到的迭代的结构就已经改变了,需要再次获取

五、map
1、C++中map容器提供一个键值对(key/value)容器,map与multimap差别仅仅在于multiple允许一个键对应多个值,而在map中key的值不能重复,对于迭代器来说,可以修改实值,而不能修改key,Map会根据key自动排序
2、基本的一些成员函数
在这里插入图片描述
例子:

#include <iostream>
#include <map>

using namespace std;

int main()
{
	map<int,string> m;
	m.insert(make_pair(1000,"hehe"));
	m.insert(make_pair(1001,"haha"));
	//输出图的大小
	cout << m.size() << endl;
	//根据key查找,输出的是value,即haha
	cout << (*m.find(1000)).second << endl;

	//获取迭代器
	map<int,string>::iterator it;
	for(it=m.begin();it!=m.end();it++)
	{
		//输出key和value
		cout << (*it).first << " " << (*it).second << endl;
	}
}

六、set
1、set是集合容器,集合中的数据会自动排序,不能重复,set和multiset类似,它和 multiset的差别在于multiset中可以有有重复的元素
2、一些基本的成员函数
在这里插入图片描述
例子:

#include <iostream>
#include <set>

using namespace std;

int main()
{
	set<int> s;
	int arr[5] = {5,4,3,2,10};
	//初始化集合
	s.insert(arr,arr+5);
	set<int>::iterator it;
	for(it=s.begin();it!=s.end();it++)
	{
		cout << *it << endl;
	}
	//查找X存不存在,存在输出1,不存在输出0
	cout << s.count(3) << endl;
	//输出大于或者等于X的第一个值,即输出10
	cout << *s.lower_bound(6) << endl;
}

七、deque
1、deque是双端队列,用法与向量基本一致,但可以在头和尾快速插入和删除,它相比于 vector 的优点是,vector 在头部删除或添加元素的速度很慢,在尾部添加元素的性能较好,而 deque 在头尾增删元素都具有较好的性能
2、一些基本的成员函数
在这里插入图片描述

例子:

#include <iostream>
#include <deque>

using namespace std;

int main()
{
	//创建一个队列,并初始化为0
	deque<int> d(10,0);
	for(int i=0; i<d.size(); i++)
	{
		d[i] = i;
	}

	for(int i=0; i<d.size(); i++)
	{
		cout << d[i] << endl;
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值