STL容器和迭代器用法归纳(1)

来源:互联网 发布:2018高考倒计时软件 编辑:程序博客网 时间:2024/04/30 18:15

 

          在我所看到的介绍STL的几本书和文章里。开头总要说STL能节省大量的时间和精力,但很多C++程序员确不知道,不会用,或不愿意用,因为觉得STL不好理解,不好用,复杂。可能也正如这些书中所说,我也经历过从不用到用的过程,而我身边也有人还没有使用STL。但其实只要我们需要存储信息,然后查询这些信息并使用,而且需要有一定形式的存储,并需要一定形式的获取这些存储的信息时,STL还真是一个不错的选择。因为它把一些常用的数据结构写成了很标准的模板。这样我们就不必自己再去实现一些数据结构了。 

          先说说容器。容器一个很形象的名称,就是一些用于存储数据集合的通用数据结构。  容器包括顺序容器(vector、deque、list),容器适配器(queue、priority_queue、stack),关联容器(pair工具类、map、multimap、set、multiset),其他容器(数组、string、流和bitset)。当需要选用时,我觉得主要从两个方面考虑,一个是这个容器提供了什么方法,如是如何存储一个数据,是如何找到一个存储的数据,而这些方式是不是你所需要的形式;再一个就是看查找一个存储的数据,删除一个数据用多长时间。当然如果对效率没有要求,那就看第一点了,只要这个容器提供的方法方便就可以选用它。那么我也从这两个角度总结容器的使用,简单归纳如下:

一、vector(向量):它类似一个数组,元素存储在一段连续的内存中,在<vector>头文件中定义为一个带有两个类型参数的类模板:一个是在向量中存储的元素的类型,另一个是分配器类型(此模板参数有默认值,一般可以不指定):

 

template <typename T, typename Allocator = allocator<T>> class vector;

 

 1。通常的用法就是:

 

vector<double> dVector(10);
double dTest = 2.3;
dVector.push_back(dTest);//还可以在放入其他数
double dRes = 0;
dRes = dVector[3];
   vector<int> nVector;
  nVector.push_back(1);
  nVector.push_back(5);
  nVector.push_back(2);
  nVector.push_back(8);
 nVector.insert(nVector.begin()+2, 4);
nVector.erase(nVector.begin()+1, nVector.begin()+3);

 此外,向量还提供at(),front()和back()等方法访问vector的元素;提供通常的6个重载比较操作符:==、!=、<、>、<=和>=;提供size和capacity方法得到其大小的信息;提供reserve预先分配空间,提供popback删除一个元素,提供clear清空向量。

2。向向量插入和从向量删除元素一般都需要线性时间,不过,有些操作实际上可以在vector最后位置上以摊分常量时间完成。随即访问单个元素的复杂性都为常量时间 。如果需要快速存取元素,但不打算经常增加或删除元素,就应当选用向量。

3。要注意的是[]不提供越界检查,使用方法at()提供越界检查;此外,vector类的复制构造函数和赋值操作符会对向量中所有元素完成深复制,所以为了提高效率,应当按引用或const引用向函数或方法传递vector。

4.向量很像数组,但之所以有这样的一个容器,可能在于它能动态增长,这是数组不能做到的,也是需用vector的一个重要理由。

5。有关以迭代器方式访问向量,在单独总结