1. 程式人生 > 其它 >STL迭代器介面卡

STL迭代器介面卡

STL迭代器介面卡

迭代介面卡是藉助5種基礎迭代器(輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器)實現的,並對成員方法進行了修改並添加了一些新的方法。

迭代器介面卡

名稱 功能
反向迭代器(reverse_iterator) 又稱“逆向迭代器”,其內部重新定義了遞增運算子(++)和遞減運算子(--),專門用來實現對容器的逆序遍歷。
安插型迭代器(inserter或者insert_iterator) 通常用於在容器的任何位置新增新的元素,需要注意的是,此類迭代器不能被運用到元素個數固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator) 流緩衝區迭代器(istreambuf_iterator / ostreambuf_iterator) 輸入流迭代器用於從檔案或者鍵盤讀取資料;相反,輸出流迭代器用於將資料輸出到檔案或者螢幕上。 輸入流緩衝區迭代器用於從輸入緩衝區中逐個讀取資料;輸出流緩衝區迭代器用於將資料逐個寫入輸出流緩衝區。
移動迭代器(move_iterator) 此型別迭代器是 C++ 11 標準中新新增的,可以將某個範圍的類物件移動到目標範圍,而不需要通過拷貝去移動。

1.reverse_iterator

反向迭代器是通過基礎迭代器實現的,rbegin指向容器的最後一個元素,rend指向第一個元素的前一個位置

函式 功能
operator* 以引用的形式返回當前迭代器指向的元素。
operator+ 返回一個反向迭代器,其指向距離當前指向的元素之後 n 個位置的元素。此操作要求基礎迭代器為隨機訪問迭代器。
operator++ 過載前置 ++ 和後置 ++ 運算子。
operator+= 當前反向迭代器前進 n 個位置,此操作要求基礎迭代器為隨機訪問迭代器。
operator- 返回一個反向迭代器,其指向距離當前指向的元素之前 n 個位置的元素。此操作要求基礎迭代器為隨機訪問迭代器。
operator-- 過載前置 -- 和後置 -- 運算子。
operator-= 當前反向迭代器後退 n 個位置,此操作要求基礎迭代器為隨機訪問迭代器。
operator-> 返回一個指標,其指向當前迭代器指向的元素。
operator[n] 訪問和當前反向迭代器相距 n 個位置處的元素。
base() 返回當前反向迭代器底層所使用的基礎迭代器

2.insert_iterator

迭代器介面卡 功能
back_insert_iterator 在指定容器的尾部插入新元素,但前提必須是提供有 push_back() 成員方法的容器(包括 vector、deque 和 list)。
front_insert_iterator 在指定容器的頭部插入新元素,但前提必須是提供有 push_front() 成員方法的容器(包括 list、deque 和 forward_list)。
insert_iterator 在容器的指定位置之前插入新元素,前提是該容器必須提供有 insert() 成員方法。

提供有 push_back() 成員方法的容器包括 vector、deque 和 list。

vector<int> res;
back_insert_iterator<Container> back_it (res);//只有這種定義方式
back_it=1;//在res末尾插入1
back_it=2;//在res末尾插入2
//每次將新元素插入到容器的末尾後,原本指向容器末尾的迭代器會後移一位,指向容器新的末尾。
template <class Container> back_insert_iterator<Container> back_inserter (Container& x);
//在容器的任意插入元素
insert_iterator<Container> insert_it (container,it);
insert_iterator<int> insert_it(res,res.begin()+2);

3.istream_iterator

輸入流迭代器用於從輸入流中讀取資料,通過過載++運算子實現,運算子內呼叫>>讀取資料,

//建立了一個可讀取 double 型別元素,並代表結束標誌的輸入流迭代器
istream_iterator<double> eos;

STL迭代器介面卡

迭代介面卡是藉助5種基礎迭代器(輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器)實現的,並對成員方法進行了修改並添加了一些新的方法。

迭代器介面卡

名稱 功能
反向迭代器(reverse_iterator) 又稱“逆向迭代器”,其內部重新定義了遞增運算子(++)和遞減運算子(--),專門用來實現對容器的逆序遍歷。
安插型迭代器(inserter或者insert_iterator) 通常用於在容器的任何位置新增新的元素,需要注意的是,此類迭代器不能被運用到元素個數固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator) 流緩衝區迭代器(istreambuf_iterator / ostreambuf_iterator) 輸入流迭代器用於從檔案或者鍵盤讀取資料;相反,輸出流迭代器用於將資料輸出到檔案或者螢幕上。 輸入流緩衝區迭代器用於從輸入緩衝區中逐個讀取資料;輸出流緩衝區迭代器用於將資料逐個寫入輸出流緩衝區。
移動迭代器(move_iterator) 此型別迭代器是 C++ 11 標準中新新增的,可以將某個範圍的類物件移動到目標範圍,而不需要通過拷貝去移動。

1.reverse_iterator

反向迭代器是通過基礎迭代器實現的,rbegin指向容器的最後一個元素,rend指向第一個元素的前一個位置

函式 功能
operator* 以引用的形式返回當前迭代器指向的元素。
operator+ 返回一個反向迭代器,其指向距離當前指向的元素之後 n 個位置的元素。此操作要求基礎迭代器為隨機訪問迭代器。
operator++ 過載前置 ++ 和後置 ++ 運算子。
operator+= 當前反向迭代器前進 n 個位置,此操作要求基礎迭代器為隨機訪問迭代器。
operator- 返回一個反向迭代器,其指向距離當前指向的元素之前 n 個位置的元素。此操作要求基礎迭代器為隨機訪問迭代器。
operator-- 過載前置 -- 和後置 -- 運算子。
operator-= 當前反向迭代器後退 n 個位置,此操作要求基礎迭代器為隨機訪問迭代器。
operator-> 返回一個指標,其指向當前迭代器指向的元素。
operator[n] 訪問和當前反向迭代器相距 n 個位置處的元素。
base() 返回當前反向迭代器底層所使用的基礎迭代器

2.insert_iterator

迭代器介面卡 功能
back_insert_iterator 在指定容器的尾部插入新元素,但前提必須是提供有 push_back() 成員方法的容器(包括 vector、deque 和 list)。
front_insert_iterator 在指定容器的頭部插入新元素,但前提必須是提供有 push_front() 成員方法的容器(包括 list、deque 和 forward_list)。
insert_iterator 在容器的指定位置之前插入新元素,前提是該容器必須提供有 insert() 成員方法。

提供有 push_back() 成員方法的容器包括 vector、deque 和 list。

vector<int> res;
back_insert_iterator<Container> back_it (res);//只有這種定義方式
back_it=1;//在res末尾插入1
back_it=2;//在res末尾插入2
//每次將新元素插入到容器的末尾後,原本指向容器末尾的迭代器會後移一位,指向容器新的末尾。
template <class Container> back_insert_iterator<Container> back_inserter (Container& x);
//在容器的任意插入元素
insert_iterator<Container> insert_it (container,it);
insert_iterator<int> insert_it(res,res.begin()+2);

3.istream_iterator

輸入流迭代器用於從輸入流中讀取資料,通過過載++運算子實現,運算子內呼叫>>讀取資料,

//建立了一個可讀取 double 型別元素,並代表*結束標誌*的輸入流迭代器
istream_iterator<double> eos;
//建立讀取輸入流的迭代器
istream_iterator<double> iit(std::cin);
double value1,value2;
if (iit != eos) {
    //讀取一個元素,並賦值給 value1
    value1 = *iit;
}
iit++;
if (iit != eos) {
    //讀取第二個元素,賦值給 value2
    value2 = *iit;
}

4.ostream_iterator

通過過載=實現,每個輸出的元素會放到輸出流裡

//建立指定輸出流的迭代器
ostream_iterator<int> out_it(std::cout);
//寫入元素之間插入分隔符
ostream_iterator<int> out_it(std::cout,",");
ostream_iterator<int> out_it1(out_it);//拷貝構造
*out_it = "first";//直接輸出該元素
cout<<endl;//輸出回車
vector<int> res;
copy(res.begin(),res.end(),out_it);//將res中的元素寫入到輸出流

5.streambuf_iterator

從輸入緩衝區中讀取字元,與istream_iterator相比,只能讀取字元,不涉及型別轉換,速度快

//表示結尾的緩衝區迭代器
istreambuf_iterator<char> end_in;
//指定讀取的緩衝區
istreambuf_iterator<char> in{cin};
//指定讀取的緩衝區地址
istreambuf_iterator<char> in{cin.rdbuf()};
while(in!=end_in){
    str+=*in++;
}

6.ostreambuf_iterator

將指定字元寫入到輸出緩衝區

//傳遞緩衝區物件
ostreambuf_iterator<char> out_it(cout);
//傳遞緩衝區物件地址
ostreambuf_iterator<char> out_it(cout.rdbuf());
*out_it='A';
string s="STL";
copy(s.begin(),s.end(),out_it);

7.move_iterator

通過移動而不是複製的方式將元素移動

//通過呼叫該模板類的預設建構函式,可以建立一個不指向任何物件的移動迭代器。
//將 vector 容器的隨機訪問迭代器作為新建移動迭代器底層使用的基礎迭代器
typedef vector<string>::iterator Iter;
//呼叫預設建構函式,建立移動迭代器
move_iterator<Iter>mIter;

//建立move_iterator同時初始化
vector<string> myvec{ "one","two","three" };
typedef vector<string>::iterator Iter;
std::move_iterator<Iter>mIter(myvec.begin());//指向第一個元素

//move_iterator支援用已有的同類型的move_iterator初始化
move_iterator<Iter>mIter2(mIter);

//呼叫make_move_iterator
template <class Iterator> move_iterator<Iterator> make_move_iterator (const Iterator& it);
typedef vector<string>::iterator Iter;
vector<string> myvec{ "one","two","three" };
move_iterator<Iter>mIter = make_move_iterator(myvec.begin());
vector<string> v{ "one","two","three" };
vector<string> it(make_move_iterator(v.begin()), make_move_iterator(v.end()));
//移動後v中沒有元素

move_iterator 模板類提供base()方法,獲取到移動迭代器底層所使用的基礎迭代器

8.advance、distance

迭代器輔助函式 功能
advance(it, n) it 表示某個迭代器,n 為整數。該函式的功能是將 it 迭代器前進或後退 n 個位置。n可以為負(後退)
distance(first, last) first 和 last 都是迭代器,該函式的功能是計算 first 和 last 之間的距離。
begin(cont) cont 表示某個容器,該函式可以返回一個指向 cont 容器中第一個元素的迭代器。
end(cont) cont 表示某個容器,該函式可以返回一個指向 cont 容器中最後一個元素之後位置的迭代器。
prev(it) it 為指定的迭代器,該函式預設可以返回一個指向上一個位置處的迭代器。注意,it 至少為雙向迭代器。
next(it) it 為指定的迭代器,該函式預設可以返回一個指向下一個位置處的迭代器。注意,it 最少為前向迭代器。
vector<int> arr{1,2,3};
vector<int>::iterator it=arr.begin();
advance(it,2);//3
distance(it.begin(),it.end());//3

9.const_iterator

vector.insert(iterator,value);

這裡iterator的型別為const_iterator(const_reverse_iterator),當傳入iterator(reverse_iterator)時會進行隱式型別轉換

強制轉換

//將 const_iterator 轉換為 iterator
advance(iter, distance<cont<T>::const_iterator>(iter,citer));
//將 const_reverse_iterator 轉換為 reverse_iterator
advance(iter, distance<cont<T>::const_reverse_iterator>(iter,citer));

實現方式的本質是,先建立一個迭代器 citer,並將其初始化為指向容器中第一個元素的位置。在此基礎上,通過計算和目標迭代器 iter 的距離(呼叫 distance()),將其移動至和 iter 同一個位置(呼叫 advance()),由此就可以間接得到一個指向同一位置的 iter 迭代器。

10.begin()、end()

template <class Container> auto begin (Container& cont);//返回普通迭代器
template <class Container> auto begin (const Container& cont);//返回const型別迭代器

begin(vector) 等同於執行 vector.begin()

begin(),end()也可以用來遍歷陣列

int arr[]=[1,2,3,4,5];
for (int *it = begin(arr); it != end(arr); ++it)
    cout<<*it<<endl;

11.prev()、next()

advance移動的是迭代器本身

prev() 獲取一個距離指定迭代器 n 個元素的迭代器

vector<int> arr{1,2,3,4,5};
auto it=arr.end();
auto i=prev(it,2);//2,返回一個新的迭代器