分享

标准模板类(STL)(四),容器的比较、对比和总结

 quandsu 2013-09-04

(三)容器的比较和对比和总结

1、若两容器长度相同、所有元素相等,则两个容器就相等,否则为不等。若两容器长度不同,但较短容器中所有元素都等于较长容器中对应的元素,则较短容器小于另一个容器;若两个容器均不是对方的子序列,则取决于所比较的第一个不等的元素。

#include <vector>

#include <iostream>

int main()

{

std::vector<int> v1;

std::vector<int> v2;

v1.push_back (5); 

v1.push_back (1);

v2.push_back (1);

 v2.push_back (2);

v2.push_back (3);

std::cout << (v1 < v2);

   return 0;

}

2、所有标准库容器共有的成员函数。

相当于按词典顺序比较两个容器大小的运算符:=, < , <= , >  , >=, == , !=

empty : 判断容器中是否有元素

max_size: 容器中最多能装多少元素

size:   容器中元素个数

swap: 交换两个容器的内容

3、只在第一类容器中的函数:

begin   返回指向容器中第一个元素的迭代器

end     返回指向容器中最后一个元素后面的位置的迭代器

rbegin   返回指向容器中最后一个元素的迭代器

rend    返回指向容器中第一个元素前面的位置的迭代器

erase   从容器中删除一个或几个元素

clear   从容器中删除所有元素

38、标准模板类(STL)(四),容器的比较、对比和总结 - EdwardLewis - 墨涵天地

4、迭代器

    用于指向第一类容器中的元素。有const 和非 const两种。

    通过迭代器可以读取它指向的元素,通过非const迭代器还能修改其指向的元素迭代器用法和指针类似。

定义一个容器类的迭代器的方法可以是:

容器类名::iterator  变量名;

或:容器类名::const_iterator 变量名;

访问一个迭代器指向的元素:迭代器变量名

    迭代器上可以执行 ++ 操作以指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。

要使用一个past-the-end值的迭代器来访问对象是非法的,就好像使用NULL或未初始化的指针一样。例如:

#include <vector>

#include <iostream>

using namespace std;

int main()  {

vector<int> v; //一个存放int元素的向量,一开始里面没有元素

v.push_back(1);

v.push_back(2); 

v.push_back(3);  

v.push_back(4);

vector<int>::const_iterator i;   //常量迭代器

for( i = v.begin();i != v.end();i ++ ) 

cout << * i << ",";

cout << endl;

vector<int>::reverse_iterator r;  //反向迭代器

for( r = v.rbegin();r != v.rend();r++ ) 

cout << * r << ",";

cout << endl;

vector<int>::iterator j;   //非常量迭代器

for( j = v.begin();j != v.end();j ++ ) 

* j =  100;

for( i = v.begin();i != v.end();i++ ) 

cout << * i << ",";

}

输出结果:

1,2,3,4,

4,3,2,1,

100,100,100,100,

不同容器上支持的迭代器功能强弱有所不同。容器的迭代器的功能强弱,决定了该容器是否支持STL中的某种算法。

1:只有第一类容器能用迭代器遍历。

2:排序算法需要通过随机迭代器来访问容器中的元素,那么有的容器就不支持排序算法。

5STL中的迭代器

STL 中的迭代器按功能由弱到强分为5种:

   1. 输入:Input iterators 提供对数据的只读访问。

   1. 输出:Output iterators 提供对数据的只写访问

   2. 正向:Forward iterators 提供读写操作,并能一次一个地向前推进迭代器。

   3. 双向:Bidirectional iterators提供读写操作,并能一次一个地向前和向后移动。

   4. 随机访问:Random access iterators提供读写操作,并能在数据中随机移动。

    编号大的迭代器拥有编号小的迭代器的所有功能,能当作编号小的迭代器使用。

6、不同迭代器所能进行的操作(功能)

所有迭代器: ++p, p ++

输入迭代器: * p, p = p1, p == p1 , p!= p1

输出迭代器: * p, p = p1

正向迭代器: 上面全部

双向迭代器: 上面全部,--p, p --,

随机访问迭代器: 上面全部,以及:

p+= i, p -= i, 

p + i: 返回指向 后面的第i个元素的迭代器

p - i: 返回指向 前面的第i个元素的迭代器

p[i]:  p 后面的第i个元素的引用

p < p1, p <= p1, p > p1, p>= p1

7、容器所支持的迭代器类别

在上面的表中已作了说明,有点乱,现总结一下如下所示:

容器 

迭代器类别

vector

随机

deque

随机

list

双向

set/multiset

双向

map/multimap

双向

Stack

不支持迭代器

queue

不支持迭代器

priority_queue

不支持迭代器

例如,vector的迭代器是随机迭代器,所以遍历 vector 可以有以下几种做法:

vector<int> v(100);

vector<int>::value_type i; //等效于写 int i;(P687)

for(i = 0;i < v.size() ; i ++)

cout << v[i];

vector<int>::const_iterator ii;

for( ii = v.begin(); ii != v.end ();ii ++ )

cout << * ii;

//间隔一个输出:

ii = v.begin();

while( ii < v.end()) {

cout << * ii;  

ii = ii + 2; 

}

而 list 的迭代器是双向迭代器,所以以下代码可以:

list<int> v;

list<int>::const_iterator ii;

for( ii = v.begin(); ii != v.end ();ii ++ )

cout << * ii;

以下代码则不行:

for( ii = v.begin(); ii < v.end ();ii ++ )

cout << * ii;

//双向迭代器不支持 <

for(int i = 0;i < v.size() ; i ++)

cout << v[i]; //双向迭代器不支持 []

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多