STL 入门--vector list deque 区别

来源:互联网 发布:知乎童谣事件 编辑:程序博客网 时间:2024/05/16 09:45

stl的内容很多,本文就实际中比较常用的和初学时应该注意的方面进行介绍

任何一门高级计算机语言,都需要有一定的类库或者函数库的支持。C++的标准库(c++ standard library),在1998年成为国际标准。在这个标准库中,包含了一个很重要的组成部分,也就是这篇文章的主题所在---标准模板库STL(standard template library)。为了在标准库中加入这个部分,c++的标准甚至推迟了出炉的日期,可见它在整个标准库中的重要地位。

在标准中只是规定了stl库的实现规范,任何人都可以根据这个规范实现出stl库,所以现在的stl库有很多版本,他们的实现方法也不完全相同。

一、    工作环境
由于STL是98年标准的产物,所以早先的C++编译器(比如tc3.0)是无法编译运行使用了STL库的程序的。当然,现在流行的C++编译器或开发环境都提供了对它的支持,比如visual c++和c++ builder, g++等等。所以,stl自然的可以应用到所有的用标准c++开发的程序中去。



二、    第一个使用了STL程序
//一个对数组进行快速排序的程序
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]= {3, 4, 7, 10, 3, 2, 1, 5, 6, 7};
int i = 0;
    sort(a, a+10);
    for(; i < 10; i++)
{
    cout << a[i] <<” “<<endl;
}
}
这么短的快速排序程序可能以前没有见过吧:),既没有比较大小,也没有元素交换,就完成了工作。
    现在提出另一个问题,要对事先不知道个数的元素进行排序,看看使用STL的解决方案。
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;

int main()
{
    vector<int> vec;
    int n;
    cin >> n;
while(n--)
{
        int x;
        cin >> x;
        vec.push_back(x);
}
sort(vec.begin(), vec.end());
}
vector,暂且把他看成一个类似数组的东西,过会我们会详细地讲解他的用法。
从上面两个例子, 我们可以看到stl最常用的两大类组件:容器和算法。容器,顾名思义是用来存放数据的,就如同第二个例子里的vector。算法,当然是用来对数据进行操作的啦,第一个例子里的sort()就是stl里很多算法的一个。

三、    容器类模板介绍
在stl中,使用频率最高的容器类模板有三个vector, list, deque
1.vector模板的常用使用方法
    vector容器的性质类似于数组,他的元素排列方式和c++的内建数组一样,在内存中顺序排列。
    声明: vector<string> vec; // 一个空的vector容器
vector<int> vec(10) //一个有10个int元素的容器
vector<float> vec(10, 0.5)//一个有10个float元素的容器,并且他们得值都是0.5
使用:(1) push_back()、pop_back()和size()方法,这是对vector操作的两个常用方法。Push_back()用于将一个元素插入vector的尾部,而pop_back()则将最后一个元素删除。就要用到size()返回整型值,表示vector里有多少元素。例如:
        vector<int> vec;
vec.push_back(4);
vec.push_back(5);
vec.pop_back(); //此时vec中有一个元素4
        int s = vec.size(); // s的值是1
        对于事先不知道大小的vector, 我们通常都用push_back(),将元素送入容器中,比如开头第二个例子。
        
(2)[]运算符,前面说了,vector的性质类似于数组,所以他支持[]运算符,使得对数组的运算方法完全适用于vector。也就是说,vector有和数组一样的“下标”概念。
    vector<int> vec(100, 5); //有100个元素且元素值都为5的vector
    for(int j = 0; j < 100; j++)
        vec[j] = vec[j]+1; //通过下标遍历这个vector
(3)指向vector内元素的指针vector<T1>::iterator
这种指针实际上是一种智能指针,它实际上也是一个模板,但是重载了指针的常用运算符,比如++,--。它定义在vector头文件中。与vector<T1>::iterator相关的方法有:
begin():用来获得一个指向vector第一个元素的指针
end():用来获得一个指向vector最后一个元素之后的那个位置的指针,注意不是指向最后一个元素。
erase(vector<T1>::iterator):用来删除作为参数所传入的那个iterator所指向的那个元素。

举一个使用iterator来遍历vector的例子
vector<int> vec(100, -1);
vector<int>::iterator iter;
for(iter = vec.begin(); iter != vec.end(); iter++)
{
    //. . . . . . .
}
for(iter = vec.end()-1;iter != vec.begin()-1; iter--)
{
    //. . . . . . .
}

2.list模板简介
    list,是一个链表类的容器,它的元素在内存中不是顺序排列的,而是通过指针链接的,这一点使它和vector有了本质的区别。
    常用方法:
    (1)push_back(), pop_back(), push_front(), pop_front(),前两个方法和vector中的两个同名方法作用相同,而push_front()用来从list的前端插入一个元素,pop_front()用来删除list的第一个元素。
    (2)list不支持[]――下标运算符,所以对其中的元素进行存取遍历只能通过指针了。指向list所存元素的指针是list<T1>::iterator,和vector<T1>::iterator一样,它也支持++,--运算符。
begin():用来获得一个指向list第一个元素的指针
end():用来获得一个指向list最后一个元素之后的那个位置的指针,注意不是指向最后一个元素。
erase(list<T1>::iterator):用来删除作为参数所传入的那个iterator所指向的那个元素。

举一个使用iterator来遍历list的例子
list<string> stringList;
list<string>::iterator iter;
for(iter = stringList.begin(); iter != stringList.end(); iter++)
{
    //. . . . . . .
}
for(iter = stringList.end()-1;iter != stringList.begin()-1; iter--)
{
    //. . . . . . .
}

一个使用iterator来删除元素的例子
list<string> stringList;
list<string>::iterator iter;
advance(iter, 5); //将iterator指向stringList的第五个元素
stringList.erase(iterator);//删除
那么删除操作进行以后,传入erase()方法的iterator指向哪里了呢?它指向了删除操作前所指向的那个元素的后一个元素。

3.deque模板
deque模板是一个队列类的模板,它的常用方法如下:
定义: deque<double> deq;
        deque<double> deq(5);//deque是可以定义初始大小的
(1)[]下标运算符,使用方法和vector是完全一样的。
(2)push_back(), pop_back(), push_front(), pop_front()这四个方法的用法和list模板中的是完全一样的。
(3)指向deque类容器所存元素的指针deque<T1>::iterator
4.这三个模板的总结 比较和一般使用准则
这三个模板都属于序列类模板,可以看到他们有一些通用方法
size():得到容器大小
begin():得到指向容器内第一个元素的指针(这个指针的类型依容器的不同而不同)
end():得到指向容器内最后一个元素之后一个位置的指针
erase():删除传入指针指向的那个元素
clear():清除所有的元素
==运算符:判断两个容器是否相等
=运算符:用来给容器赋值

上面的三个模板有各自的特点
vector模板的数据在内存中连续的排列,所以随机存取元素(即通过[]运算符存取)的速度最快,这一点和数组是一致的。同样由于它的连续排列,所以它在除尾部以外的位置删除或添加元素的速度很慢,在使用vector时,要避免这种操作。
list模板的数据是链式存储,所以不能随机存取元素。它的优势在于任意位置添加 删除元素的速度。

deque模板是通过链接若干片连续的数据实现的,所以均衡了以上两个容器的特点

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子计算老出错怎么办 工作中总是马虎怎么办 孩子总是计算错误怎么办 做设计老是犯错怎么办 小学生阅读总出错怎么办 写作文没思路怎么办 孩子不爱写作文怎么办 写作文没有素材怎么办 写作文没有灵感怎么办 做事工作马虎粗心大意怎么办 小孩作业马虎粗心大意怎么办 孩子写字一直错怎么办 孩子写字老错怎么办 写错字涂黑了怎么办 写错字不能涂改怎么办 孩子爱写错别字怎么办 孩子读题马虎怎么办 孩子知错不该怎么办 小孩胆小反应慢怎么办 孩孑经常流鼻血怎么办 中考考号写错了怎么办 头后仰就头晕怎么办 感觉自己要晕倒怎么办 孩子不愿动手写字怎么办 老年人恶心想吐怎么办 小学生老写错别字怎么办 突然头晕站不稳 怎么办 早上起床突然天旋地转怎么办 躺着突然感觉天旋地转怎么办 眩晕症发作时怎么办 低血糖恶心想吐怎么办 更年期头晕头胀怎么办 年轻人头晕头胀怎么办 教案:《眯眼了怎么办》 迷路了怎么办活动意图 幼儿迷路了怎么办图片 中班迷路了怎么办教案 大门与大门相对怎么办 孩子长倒睫毛怎么办 孩子考倒数第一怎么办 孩子在班里倒数怎么办