(三)容器的比較和對(duì)比和總結(jié) 1,、若兩容器長(zhǎng)度相同,、所有元素相等,則兩個(gè)容器就相等,,否則為不等,。若兩容器長(zhǎng)度不同,但較短容器中所有元素都等于較長(zhǎng)容器中對(duì)應(yīng)的元素,,則較短容器小于另一個(gè)容器;若兩個(gè)容器均不是對(duì)方的子序列,,則取決于所比較的第一個(gè)不等的元素。 #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,、所有標(biāo)準(zhǔn)庫(kù)容器共有的成員函數(shù),。 相當(dāng)于按詞典順序比較兩個(gè)容器大小的運(yùn)算符:=, < , <= , > , >=, == , != empty : 判斷容器中是否有元素 max_size: 容器中最多能裝多少元素 size: 容器中元素個(gè)數(shù) swap: 交換兩個(gè)容器的內(nèi)容 3,、只在第一類(lèi)容器中的函數(shù): begin 返回指向容器中第一個(gè)元素的迭代器 end 返回指向容器中最后一個(gè)元素后面的位置的迭代器 rbegin 返回指向容器中最后一個(gè)元素的迭代器 rend 返回指向容器中第一個(gè)元素前面的位置的迭代器 erase 從容器中刪除一個(gè)或幾個(gè)元素 clear 從容器中刪除所有元素 4、迭代器 用于指向第一類(lèi)容器中的元素,。有const 和非 const兩種,。 通過(guò)迭代器可以讀取它指向的元素,通過(guò)非const迭代器還能修改其指向的元素,。迭代器用法和指針類(lèi)似,。 定義一個(gè)容器類(lèi)的迭代器的方法可以是: 容器類(lèi)名::iterator 變量名; 或:容器類(lèi)名::const_iterator 變量名; 訪問(wèn)一個(gè)迭代器指向的元素:* 迭代器變量名 迭代器上可以執(zhí)行 ++ 操作, 以指向容器中的下一個(gè)元素。如果迭代器到達(dá)了容器中的最后一個(gè)元素的后面,,則迭代器變成past-the-end值,。 要使用一個(gè)past-the-end值的迭代器來(lái)訪問(wèn)對(duì)象是非法的,就好像使用NULL或未初始化的指針一樣,。例如: #include <vector> #include <iostream> using namespace std; int main() { vector<int> v; //一個(gè)存放int元素的向量,,一開(kāi)始里面沒(méi)有元素 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 << ","; } 輸出結(jié)果: 1,2,3,4, 4,3,2,1, 100,100,100,100, 不同容器上支持的迭代器功能強(qiáng)弱有所不同。容器的迭代器的功能強(qiáng)弱,,決定了該容器是否支持STL中的某種算法,。 例1:只有第一類(lèi)容器能用迭代器遍歷。 例2:排序算法需要通過(guò)隨機(jī)迭代器來(lái)訪問(wèn)容器中的元素,,那么有的容器就不支持排序算法,。 5、STL中的迭代器 STL 中的迭代器按功能由弱到強(qiáng)分為5種: 1. 輸入:Input iterators 提供對(duì)數(shù)據(jù)的只讀訪問(wèn),。 1. 輸出:Output iterators 提供對(duì)數(shù)據(jù)的只寫(xiě)訪問(wèn) 2. 正向:Forward iterators 提供讀寫(xiě)操作,,并能一次一個(gè)地向前推進(jìn)迭代器。 3. 雙向:Bidirectional iterators提供讀寫(xiě)操作,,并能一次一個(gè)地向前和向后移動(dòng),。 4. 隨機(jī)訪問(wèn):Random access iterators提供讀寫(xiě)操作,并能在數(shù)據(jù)中隨機(jī)移動(dòng),。 編號(hào)大的迭代器擁有編號(hào)小的迭代器的所有功能,,能當(dāng)作編號(hào)小的迭代器使用。 6,、不同迭代器所能進(jìn)行的操作(功能) 所有迭代器: ++p, p ++ 輸入迭代器: * p, p = p1, p == p1 , p!= p1 輸出迭代器: * p, p = p1 正向迭代器: 上面全部 雙向迭代器: 上面全部,,--p, p --, 隨機(jī)訪問(wèn)迭代器: 上面全部,以及: p+= i, p -= i, p + i: 返回指向 p 后面的第i個(gè)元素的迭代器 p - i: 返回指向 p 前面的第i個(gè)元素的迭代器 p[i]: p 后面的第i個(gè)元素的引用 p < p1, p <= p1, p > p1, p>= p1 7,、容器所支持的迭代器類(lèi)別 在上面的表中已作了說(shuō)明,,有點(diǎn)亂,現(xiàn)總結(jié)一下如下所示:
例如,,vector的迭代器是隨機(jī)迭代器,,所以遍歷 vector 可以有以下幾種做法: vector<int> v(100); vector<int>::value_type i; //等效于寫(xiě) 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; //間隔一個(gè)輸出: 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]; //雙向迭代器不支持 [] |
|