<utility.h>utility中只有模版類pair,和一些與之相關聯得模版操作符,該模版類用來將兩個對象合併爲一個對象,當你想要一個函數返回兩個值得時就比較方便了。
其中模版函數make_pair可以在必要時產生一個pair對象,該函數在檢測參數時忽略掉所有CONST屬性,所以不能依賴他產生包含一個或多個常量成員對象得pair對象。
測試文件:
#include "iostream"
#include "assert.h"
#include "utility"
using namespace std;
class Int
{
public:
Int(int v):val(v){}
Int(){val=0;}
bool operator==(Int x)const{return (val==x.val);}//僅重載==AND<就可以了,其他的庫會幫我們完成
bool operator<(Int x) const{return (val<x.val);} //重載函數
private:
int val;
};
typedef pair<int ,char>pair_ic;
pair_ic p0;
typedef pair<Int,char>pair_id;
pair_id d0;
int main()
{
pair_ic p1=p0,p2(3,'a');
assert(p1.first==0);
assert(p1.second==0);
assert(p2.first==3);
assert(p2.second=='a');
assert(p2==make_pair((pair_ic::first_type)3,(pair_ic::second_type)'a'));
assert(p2<make_pair((pair_ic::first_type)4,(pair_ic::second_type)'a'));
assert(p2<make_pair((pair_ic::first_type)3,(pair_ic::second_type)'b'));
assert(p1!=p2);
Int a(2),b(3);
pair_id d0(a,'a');
pair_id d1(a,'b');
assert(d0!=d1);
assert(d0<=d1);
assert(d1>=d0);
return 0;
}
<iterator> 中定義了迭代器得使用方法,主要得模版類有:
插入迭代器
插入迭代器是一種迭代器適配器,帶有一個容器參數,並生成一個迭代器,用於在指定的容器中插入元素。通過插入迭代器賦值時,迭代器將會插入一個新的元素。C++語言提供了三種插入器,其差別在於插入元素的位置不同:
istream_iterator<T> in(strm); | 創建從輸入流strm中讀取T類型對象的istream_iterator對象,strm是一個輸入流 |
istream_iterator<T> in; | istream_iterator對象的超出末端迭代器 |
ostream_iterator<T> out(strm); | 創建將T類型的對象寫到輸出流strm的ostream_iterator對象 |
ostream_iterator<T> out(strm, delim); | 創建將T類型的對象寫到輸出流strm的ostream_iterator對象,在寫入過程中使用delim作爲元素的分隔符。delim是以空字符結束的字符數組 |
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main() {
istream_iterator<int> in_iter(cin);
istream_iterator<int> eof;
//vector<int> vec(in_iter, eof); //do the same work as following loop
vector<int> vec;
while (in_iter != eof)
vec.push_back(*in_iter++); //*in_iter可以取出輸入流中得元素
vector<int>::const_iterator it = vec.begin();
for(; it != vec.end(); ++it)
cout<<*it<<endl;
return 0;
}
#include <iostream>
#include <iterator>
using namespace std;
int main() {
ostream_iterator<string> out_iter(cout, "/n");
istream_iterator<string> in_iter(cin), eof;
while (in_iter != eof)
*out_iter++ = *in_iter++;
return 0;
}
反向迭代器
反向迭代器是一種反向遍歷容器的迭代器。也就是,從最後一個元素到第一個元素遍歷容器。反向迭代器將自增(和自減)的含義反過來了:對於反向迭代器,++運算將訪問前一個元素,而--運算則訪問下一個元素。
(1)反向迭代器需要使用自減操作符:標準容器上的迭代器(reverse_iterator)既支持自增運算,也支持自減運算。但是,流迭代器由於不能反向遍歷流,因此流迭代器不能創建反向迭代器。
(2)可以通過reverse_iterator::base()將反向迭代器轉換爲普通迭代器使用,從逆序得到普通次序。
測試:
#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
using namespace std;
int main() {
string str = "this 'sentence' is a test";
cout<<str<<endl;
string::iterator it1 = find(str.begin(), str.end(), '/'');
string::iterator it2 = find(++it1, str.end(), '/'');
cout<<string(it1, it2)<<endl;
string::reverse_iterator rit1 = find(str.rbegin(), str.rend(), '/'');
string::reverse_iterator rit2 = find(++rit1, str.rend(), '/'');
cout<<string(rit1, rit2)<<endl;
cout<<string(rit2.base(), rit1.base())<<endl;
getchar();
return 0;
}
不同的迭代器支持不同的操作集,而各種算法也要求相應的迭代器具有最小的操作集。因此,可以將算法的迭代器分爲下面五類:
輸入迭代器
(input iterator)
讀,不能寫。支持的操作集:==, !=, 前綴++, 後綴++, *, ->。例如,find, accumulate算法要求這類迭代器。
輸出迭代器
(output iterator)
寫,不能讀。支持的操作集:前綴++, 後綴++, *(只能出現在賦值運算的左操作數上)。推出迭代器要求每個迭代器必須正好寫入一次。例如,ostream_iterator是輸出迭代器,copy算法使用這類迭代器。
前向迭代器(forward iterator)
讀和寫,支持輸入迭代器和輸出迭代器提供的所有操作,還支持對同一個元素的多次讀寫。例如,replace算法需要這種迭代器。
雙向迭代器(bidirectional iterator)
讀和寫,除了支持前向迭代器的所有操作,還支持前綴--和後綴--,即支持雙向遍歷容器。例如,reverse算法要求這類迭代器。標準庫容器中提供的迭代器都至少達到雙向迭代器的要求。
隨機訪問迭代器(random-access iterator)
讀和寫。提供在常量時間內訪問容器任意位置的功能。支持完整的迭代器操作集:1)關係運算:==, !=, <, <=, >, >=;2)算術運算:it + n, it - n, it += n, it -= n以及it1 - it2;3)下標運算:it[n],等價於*(it + n)。需要隨機訪問迭代器的泛型算法包括sort算法。例如,vector, deque, string迭代器是隨機訪問迭代器,用作訪問內置數組元素的指針也是隨機訪問迭代器。
除了輸出迭代器,其他類別的迭代器形成了一個層次結構:需要低級類別迭代器的地方,可使用任意一種更高級的迭代器。例如,對於需要輸入迭代器的算法,可傳遞前向、雙向或隨機訪問迭代器調用該算法。而反之則不行。注意:向算法傳遞無效的迭代器類別所引起的錯誤,無法保證會在編譯時被捕獲到。
map, set, list類型提供雙向迭代器,而string, vector和deque容器上定義的迭代器都是隨機訪問迭代器,用作訪問內置數組元素的指針也是隨機訪問迭代器。istream_iterator是輸入迭代器,ostream_iterator是輸出迭代器。
另外,雖然map和set類型提供雙向迭代器,但關聯容器只能使用這部分算法的一個子集。因爲關聯容器的鍵是const對象。因此,關聯容器不能使用任何寫序列元素的算法。只能使用與關聯容器綁在一起的迭代器來提供用於讀操作的實參。因此,在處理算法時,最好將關聯容器上的迭代器視爲支持自減運算的輸入迭代器,而不是完整的雙向迭代器。
<memory> 它以不同尋常得方式爲容器中得元素分配存儲空間,它同樣也爲某些算法執行期間產生得臨時對象提供機制,主要模版類爲:allocator由他產生容器得默認分配器,我們很少需要直接與分配器打交道,默認得分配器已經可以很好得爲我們工作了,但它又包含在標準C++庫中所定義得每個容器模版類得模版參數裏。