花了两个小时去看了STL的简介,算是能够运行STL的hallo world程序了,以下是我的一些整理:
STL,也就是所谓的C++标准模板库。既然程序=数据结构+算法,我们写C++程序时其实很多算法和数据结构是经常用到的,例如排序算法,或许你绞尽脑汁查阅数据结构的书写出的希尔排序效果还不如人家已经写好的快速排序。作为前人智慧的结晶,很多模板和算法都是做到了把内存占用和计算量的最小化,也就是说,如果要写算法题,学习STL时很有必要的。第一次接触的时候是在刷PAT-Blevel的时候,有一道题,不管我怎么优化测试点总是超时,查阅了网上的资料才发现其实AC的答案都是用的STL。在这个层面上,代码的重用真的比自己的聪明才智要重要的多。
2016.11.24 程度:刚学完C++的基础语法并且刷完的PAT-Blevel,数据结构在学
废话不多说
show me the code:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> v1;//这个语句创建了一个动态数组对象v1,我们就可以调用类内的函数来对v1进行操作。
vector<int> v2;
v1.push_back(1);//1
v1.push_back(2);//1 2
v1.pop_back();//1
v2.push_back(3);
v2.push_back(4);
//v2.pop_back();
//v2.pop_back();
cout << (v1 > v2);//1
return 0;
}
这里我们能看到很多东西:
头文件引用了vector,代表下面我们要用vector这个容器了。为什么叫它容器呢,容器==放数据的地方,vector,我的理解就是它就是一种数据结构的实现,平时我们一般叫它“动态数组”,也就是数组。
vector<int> v1;这个语句创建了一个动态数组对象v1,我们就可以调用类内的函数来对v1进行操作。
这样理解起来就很简单了,vector就像是类,v1就像是对象,他有很多函数,还有很多带模板的友元函数,这就是我体会到的所有的功能。我们的目的就是记住这些常用的函数。
然后我们就能像操作栈一样pop和push to the end.vector内部的实现非常精妙,所以在尾部进行push和pop都很快。当然,本质上是数组,所以中间的插入和删除涉及到数据移位就比较慢了。一个一个push,很慢,所以有的时候我们能把数组copy到vector里(调用copy函数)int a[5]={2,3,4,5,11};
vector<int>v(a,a+5);
这样就实现了复制,a数组我们也可以对他求pop啦,push啦,求长度什么的了,这里注意是加5,因为STL里习惯上都会多出一位,判断某个遍历过程结束也是读到NULL后就结束而不会返回到最后一位。
然而这样并不能体现vector的优越性好像TAT
所以介绍几个比较常用的体现vector优越性函数:
v1.insert(1,1)//在位置1插入1
v1.begin()//初始位置
v1.end()//结束位置
v1.front()//返回容器第一个元素的 引用
v1.back()//返回容器最后一个元素的 引用
v1.find(v1.begin(),v1.end(),1)//返回查找到第一个的1的位置(迭代器,可以看成是 指针,可以用*运算符访问找到的1),如果失败返回npos(可能是-1)
另外和string类一样,他也有assign函数,clear函数,size函数,max_size,empty,以及析构函数~vector。
还有例子里直接对数组进行大小比较(很yingba)比较方法和string类的比较方法是一样的,字典怎么排他就怎么排
对string类不熟悉的请先去复习复习string类的常用函数。
当然如果想排序,可以在头文件添加#include<algorithm>
这时候就可以通过sort(v1.begin(),v1.end())来排序了,它用的是快速排序,效率极高。
但是如果v1的元素是自定义的对象或者并不想从小到大比较怎么办呢
别急,可以定义
bool compare(T &a,T &b){//T=数据类型
return a>b;//自己定义
}
然后再调用sort(v1.begin(),v1.end(),compare)
来重新自定义排序
当然类似的还有很多,比如这样
remove(v2.begin(),v2.end(),1);
移除了v2里所有的1,是所有的1而不是第一个1哦
还能这样
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v1.begin());
把v2加到v1那里,然后放到v1那里同时删除v2
甚至这样
reverse(v1.begin(),v1.end());
从begin到end进行颠倒
注意以上的几个函数都是可以对顺序容器生效的,比如链表啊,数组啊。
那么除了数组,STL还提供了很多类似的数据结构,such as:
链表List 双向的,也就是说,它可以在中间插入元素,而完成时间却是常数时间,当然,代价是它的储存容量较大。
队列deque,这个不常用,因为vector差不多够用了,尾部插入和删除有差,但不会太差
集合set,和我刚上周学的并查集差不多,但是不允许元素重复。有重复的话要用multiset
映射map,还没学到,不过也是不能元素重复的,有重复的也要加multi
迭代器只会用一点点,表示很神奇的是迭代器居然有监视的功能。