第十二课 标准模板库STL——序列性容器

一、标准模板库STL

STL具有六大组件:容器、迭代器、算法、容器适配器、空间适配器、仿函数

二、容器

容器分为两个类:序列性容器和关联性容器

1.序列性容器:元素保持在容器中原始的位置,允许指定插入元素的位置,元素的位置取决于插入的时间和地点,与元素的值无关,例如list、vector、deque

2.关联性容器:元素的位置取决于容器特定的排序规则,与元素的值有关,例如map、set、hash_map

容器使用时会自动new、delete,不需要手动干预

2.1 list

链式结构,便于插入和删除

插入删除的时间复杂度为O(1);查找的时间复杂度为O(n)

头文件:

#include<list>

list的使用

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> lst;//空链表

	list<int> lst2(3);//三个节点的链表,链表初始化默认值默认值为0
	list<int> lst3(3, 2);//三个节点的链表,指定链表初始化值为2


	return 0;
}

使用迭代器或者增强for循环进行遍历

	list<int>::iterator ite = lst.begin();
	list<int>::iterator ite2 = lst2.begin();
	list<int>::iterator ite3 = lst3.begin();

	while (ite2!=lst2.end())
	{
		cout << *ite2 << "   ";
		ite2++;
	}
	cout << endl;
	for (int a : lst3)
	{
		cout << a << "   ";
	}

输出结果为

	list<int> lst;
	lst.push_back(8);//push_back(a)尾添加值a
	lst.push_back(2);
	lst.push_back(3);
	lst.push_front(9);//push_front(a)头添加值a
	lst.push_front(8);
	lst.push_front(7);
	list<int>::iterator ite = lst.begin();

	while (ite!=lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;

	lst.remove(8);//remove(a)将所有值为a的节点删除
	ite = lst.begin();
	while (ite != lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;

输出结果为:

	list<int> lst;
	lst.push_back(8);
	lst.push_back(2);
	lst.push_back(3);
	lst.push_front(8);
	lst.push_front(8);
	lst.push_front(7);
	lst.push_back(8);
	list<int>::iterator ite = lst.begin();

	while (ite!=lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;

	lst.unique();//将连续且相同的节点删除,只保留一个
	ite = lst.begin();
	while (ite != lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;

输出结果为

    list<int> lst;
	lst.push_back(4);
	lst.push_back(3);
	lst.push_back(1);
	lst.push_back(8);
	list<int>::iterator ite = lst.begin();

	while (ite!=lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;
	lst.sort();//对链表内的值进行排序,默认升序
	ite = lst.begin();
	while (ite != lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;

输出结果为

如果需要降序,我们需要借助规则函数

bool rule1(int a, int b)
{
	return a > b;
}

lst.sort(&rule1);

输出结果为 

 或者采用模板库提供的方法

lst.sort(greater<int>());//降序

输出为

lst.sort(less<int>());//升序

输出为

lst.sort(less<int>());//升序
	ite = lst.begin();
	while (ite != lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;
	lst.reverse();//翻转整个链表
	ite = lst.begin();
	while (ite != lst.end())
	{
		cout << *ite << "   ";
		ite++;
	}
	cout << endl;

 输出结果为

    list<int> lst1{ 1,2,3,4 };
	list<int> lst2{ 9,8,7,6 };
	lst1.splice(++lst1.begin(), lst2);//将lst2剪切到lst1的指定位置之前,并将lst2清空
	for (int v : lst1)
		cout << v << "    ";
	cout << endl;
	for (int v : lst2)
		cout << v << "    ";
	cout << endl;
	cout << sizeof(lst2);

输出结果为

 splice()是一个重载函数,还可以有如下使用方法

lst1.splice(++lst1.begin(), lst2,--lst2.end());//将lst2的最后一个节点剪切到lst1指定位置之前

输出结果为 

lst1.splice(++lst1.begin(), lst2,++lst2.begin(),--lst2.end());//将lst2的左闭右开区间剪切到lst1指定位置之前

 输出结果为

    list<int>::iterator ite = lst1.begin();
	::advance(ite, 2);//ite偏移
	lst1.splice(lst1.begin(), lst1,ite,lst1.end());//剪切自身
	for (int v : lst1)
		cout << v << "    ";
	cout << endl;

输出结果为

    list<int> lst1{ 3,2,1,4 };
	list<int> lst2{ 9,6,7,8 };
	lst1.sort();
	lst2.sort();

	lst1.merge(lst2);//将lst2合并(剪切)到lst1
	for (int v : lst1)
		cout << v << "    ";
	cout << endl;
	for (int v : lst2)
		cout << v << "    ";
	cout << endl;
	cout << lst2.size()<<endl;

 输出结果为

    list<int> lst1{ 3,2,1,4 };
	list<int> lst2{ 9,6,7,8 };
	lst1.sort(greater<int>());
	lst2.sort(greater<int>());

	lst1.merge(lst2, greater<int>());//降序合并
	for (int v : lst1)
		cout << v << "    ";
	cout << endl;
	for (int v : lst2)
		cout << v << "    ";
	cout << endl;
	cout << lst2.size()<<endl;

 

 2.2 vector向量

 vector相当于数组,可以根据需求自动扩展容量,在末尾存取是恒定的时间,在中间插入删除需要线性时间。

特点:使用下标访问元素更方便,插入删除比较影响效率

头文件:#include<vector>

但是在vector中我们要注意容量和使用量的区别

使用方法大致和list相似

不同之处过段时间补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值