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模板是通过链接若干片连续的数据实现的,所以均衡了以上两个容器的特点
- STL 入门--vector list deque 区别
- STL list,vector,deque区别
- stl 中List vector deque区别
- STL vector list deque区别与实现
- STL中vector、deque、list的区别
- STL vector list deque区别与实现
- STL中vector、list、deque的区别
- STL vector list deque区别与实现
- STL中vector、list、deque的区别
- STL deque、vector和list区别
- STL之vector、list、deque的区别
- STL中vector、list、deque的区别
- stl 中List vector deque区别
- vector,deque,list区别
- vector,deque,list区别
- vector、list、deque区别
- vector,deque,list区别
- vector list deque 区别
- [转]href="#"与href="javascript:void(0)"的区别
- CPU接口10年变迁
- USB入门
- 没有方向的船 任何风都是逆风
- CEH学习笔记之渗透测试框架
- STL 入门--vector list deque 区别
- c# 操作excel
- dock窗体反射调用
- .net 依赖缓存
- 在DockPanel 的子窗体打开另一子窗体使其停靠在主窗体的方法
- Java Web基础:第二十二讲 Ajax交互简单实例
- USB 入门2
- 端口扫描程序nmap使用手册
- ArcGIS 9.4将更名为ArcGIS 10 发布时间不变