(三)容器的比较和对比和总结 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 从容器中删除所有元素 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:排序算法需要通过随机迭代器来访问容器中的元素,那么有的容器就不支持排序算法。 5、STL中的迭代器 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: 返回指向 p 后面的第i个元素的迭代器 p - i: 返回指向 p 前面的第i个元素的迭代器 p[i]: p 后面的第i个元素的引用 p < p1, p <= p1, p > p1, p>= p1 7、容器所支持的迭代器类别 在上面的表中已作了说明,有点乱,现总结一下如下所示:
例如,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]; //双向迭代器不支持 [] |
|