浅学STL(3)——各类容器简介

在此只简单介绍动态数组(vector),双端队列(deque),链表(list),数组(array)

详细的可能会在之后的文章中一一介绍。

代码段中其他头文件也会在之后说到,这次就先不讲了。

#include<iostream> 
#include<vector>//动态数组 
#include<deque>//双端队列 
#include<list>//链表 
#include<set>//set and multiset
#include<map>//map and multimap
//#include<unordered_set>//unordered set/multiset  c++ 11
//#include<unordered_map>//unordered map/multimap  c++ 11
#include<iterator>//了解即可 
#include<algorithm>
#include<numeric>//some numeric algorithm了解即可 
#include<functional>// 了解即可 
using namespace std;
int main()
{
	vector<int> vec;//vec.size()==0
	vec.push_back(4);
	vec.push_back(1);
	vec.push_back(8);//vec:{4,1,8};vec.size()==3
	//Vector specific operations(操作):
	cout<<vec[2];// 8(no range check没有范围检查)
	cout<<vec.at(2);//8(throw range_error exception of out of range抛出越界异常)
	for(int i=0;i<vec.size();i++)
	{
		cout<<vec[i]<<" ";
	}
	for(vector<int>::iterator itr=vec.begin();itr!=vec.end();++itr)
	{
		cout<<*itr<<" ";
	}
	/*for(it: vec)//c++ 11
	{
		cout<<it<<" ";
	}*/
	//Vector is a dynamically allocated contiguous array in memory.
	//Vector是在内存中动态分配的相邻数组。
	//int* p=&vec[0]; p[2]=6;
	if(vec.empty()) { cout<<"Not possible.\n"; }
	cout<<vec.size(); // 3
	vector<int> vec2(vec); //Copy constuctor,vec2:{4,1,8}
	vec.clear(); // Remove all items in vec ;vec.size()==0
	vec2.swap(vec);//vec2 become empty,and vec has 3 items.
	//Notes:No penalty of adstraction,very efficent.
	//STL很高效 
	/*Vector:
	1.在末尾插入删除元素O(1)
	2.在头部或中间插入删除元素O(n)
	3.查询O(n) */
	//所以再来看deque(双端队列) 
	 deque<int>deq={4,6,7};
	 deq.push_front(2);//deq:{2,4,6,7}
	 deq.push_back(3);//deq:{2,4,6,7,3}
	 //Deque has simaliar interface(接口) with vector
	 //deque 和 vector 很多函数都是一样的,不做详细介绍 
	 cout<<deq[1];// 4
	/*Deque:
	1.在头部或末尾插入删除元素O(1)
	2.在中间插入删除元素O(n)
	3.查询O(n)
	貌似没解决什么大问题,但是deque可以用于构建单调队列 
	*/
	//所以再来看list(链表)
	list<int> mylist={5,2,9};
	mylist.push_back(6);//mylist:{5,2,9,6}
	mylist.push_front(4);//mylist:{4,5,2,9,6}
	
	list<int>::iterator itr=find(mylist.begin(),mylist.end(),2);//itr->2
	/* find函数主要实现的是在容器内查找指定的元素,如上从begin到end找2,
	返回找到的第一个元素的迭代器 */ 
	mylist.insert(itr,8);//mylist:{4,5,8,2,9,6}
	//O(1)!!!
	itr++;//itr->9
	mylist.erase(itr);//mylist:{4,8,2,6} O(1)!!!
	/*List:
	1.在任意位置插入删除O(1)
	2.查询O(n)
	3.no random access,no [] operator
	不能随机访问查询,没有[]操作符*/
	mylist1.splice(itr,mylist2,itr_a,itr_b);//O(1),实现了 
	//使后面链表 一段范围的元素 插入前一个链表itr后面,同时删除后面链表的元素(类比剪切) 
	//Forward List 只有后继指针,没有前驱指针 
	//与List容器相比因为是链表是单向的,在存储方面Forward List的效率更高。
	int a[3]={3,4,5};//普通数组 
	array<int,3>a={3,4,5};//array数组,自我感觉完全可以被普通数组或vector代替,了解即可
	a.begin();
	a.end();
	a.size();
	a.swap();
        array<int,4>b={3,4,5};
}	

最初起心思学习STL就是它多种多样的容器,真的感觉在这一方面了解的比较少。

最开始使用可能是会感觉到不习惯,但如果能熟练掌握,也会使你的C++能够实现更多的操作。

作者在大一的C语言结课作业就有图书馆管理系统的选做题,当时没有去做这个。据说熟练掌握链表就可以完成。

所以还是要边学边用啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值