在此只简单介绍动态数组(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语言结课作业就有图书馆管理系统的选做题,当时没有去做这个。据说熟练掌握链表就可以完成。
所以还是要边学边用啊!