STL迭代器技術

2021-06-01 02:17:48 字數 4928 閱讀 9193

stl迭代器技術

c++ stl和各種容已提供了自己的迭代器,如輸入迭代器,輸出迭代器,前向迭代器,雙向迭代器,隨機迭代器。但是

stl在已有迭代器的基礎上,仍然定義了另外一些迭代器,以簡化某些情況下的操作。一般在

stl_iterator.h

檔案中提供。

1、輸入流迭代器

istream_iterator

在istream_iterator.h

檔案中提供。實現了前向迭代操作

"++"

、"*"

操作。

istream_iterator() : _m_stream(0), _m_ok(false) {}

此建構函式用來構造乙個指向流結束位置的迭代器。

istream_iterator(istream_type& s) : _m_stream(&s)

將乙個輸入流物件s

與迭代器繫結在一起。

template>

class istream_iterator

#include #include #include #include using namespace std;

int main(void)

rfilestream >> noskipws; //讀入空格

//目標檔案的輸出流

ofstream wfilestream;

wfilestream.open("c:\\2.txt", ios::out);

if(!wfilestream)

//copy演算法使用輸入流迭代器進行檔案複製

istream_iteratoriter_ifile(rfilestream);

ostream_iteratoriter_ofile(wfilestream);

copy(iter_ifile,istream_iterator(), iter_ofile);

rfilestream.close();

wfilestream.close();

return 0;

}

2、輸出流迭代器

ostream_iterator

實現了output iterator

迭代器要求。提供了前向

"++"

、"="

操作。"++"

、"*"

只是簡單地返回

*this

迭代器自身,它們必須與賦值操作

"="結合起來才有意義。

ostream_iterator(ostream_type& s) : _m_stream(&s), _m_string(0) {}

內部繫結乙個輸出流ostream

物件。

ostream_iterator(ostream_type& s, const _chart* c)

:_m_stream(&s), _m_string(c)

用於建立乙個使用分隔字串的輸出流迭代器,每次資料寫入流,都會把預定字串c

寫入流以作做分隔。

template>

class ostream_iterator

#include #include "vector"

#include #include using namespace std;

int main()

3、向前插入迭代器

front_insert_iterator

構架在具有push_front

向前插入函式的序列容器上的

output_iterator

迭代器。有

"*"、

"++"

操作符,需要與

"="操作一起使用才有意義。

template

class front_insert_iterator

explicit front_insert_iterator(_container& x) : container(&x)

4、向後插入迭代器

back_insert_iterator

是乙個output inerator

,架構在

push_back

函式的容器上,有

"*"、

"++"

操作符,可用

*i++=t。

templateclass back_insert_iterator

back_insert_iterator(_container& x) : container(&x)

對容器物件x進行了繫結。vector,list,deque都有push_back,都可以繫結。

#include #include #include #include using namespace std;

int main(void);

int len=sizeof(iarray)/sizeof(int);

vectorv;

v.push_back(2);

v.push_back(3);

//將陣列元素從後插入到vector容器

copy(iarray, iarray+len, back_insert_iterator>(v));

//列印vector容器元素

copy(v.begin(), v.end(), ostream_iterator(cout, " "));

cout << endl;

return 0;

}

5、插入迭代器

insert_iterator

構架在insert(pos,value)

函式的容器上,提供

output iterator

的"*"

、"++"

操作,可用

*i++=t

替代insert(i,t)

語句,即在

i位置前插入元素

t。序列容器和有序的關聯容器,如

vector,list,set,map

等都提供有

insert函式,

都可進行繫結。

template

class insert_iterator

insert_iterator(_container& x, typename _container::iterator i)

: container(&x), iter(i) {}

由上可見,需提供兩個引數:繫結的容器對外,還有初始的容器迭代器。其實現如下所示:

operator=(const typename _container::const_reference value) 

#include #include #include #include using namespace std;

int main(void);

int iarray2[8]=;

sets;

merge(iarray1, iarray1 + 5, iarray2, iarray2 + 8, insert_iterator>(s, s.begin()));

copy(s.begin(), s.end(), ostream_iterator(cout, " "));

cout << endl;

return 0;

}

6、反向迭代器

reverse_iterator

基於隨機迭代器構架。有"++"

、"+n"

、"--"

、"-n"

操作的迭代方向,與原迭代器相應的迭代操作的方向相反。

templateclass reverse_iterator 

explicit

reverse_iterator(iterator_type x) : current(x)

7、反向雙向迭代器

reverse_bidirectional_iterator

「++」、「--

」操作均與原雙向迭代器的操作方向相反。內部繫結乙個雙向迭代器

current。

template::value_type,

class ref = t&,

class ptr = t *, class dist = ptrdiff_t>

class reverse_bidirectional_iterator

reverse_bidirectional_iterator();

explicit reverse_bidirectional_iterator(bidit current);

注意:這裡的*操作實際取的是上乙個元素。

#include #include #include #include using namespace std;

int main(void)

8、原始儲存迭代器

raw_storage_iterator

是用可讀寫的前向迭代器構造出來,通過*i=t

方式取代

construct(&*i,t)

函式的呼叫,實現在

i所指處生成物件t。

template class raw_storage_iterator 

raw_storage_iterator&

operator=(const _tp& element)

#include #include using namespace std;

class a

operator int() const //轉換為int列印

private:

int i;

};int main(void)

STL學習筆記 迭代器以及Traits技術

迭代器模式 提供一種方法,使之能夠依序訪問某個容器中的各個元素,而又無需暴露該容器的內部表述方式。迭代器是容器和演算法之間的膠合劑。1.如何判斷迭代器的型別 1 通過編譯器對函式模版的實參推倒可以解決引數類別的判定,如下 templatevoid func imp1 i iter,t t templ...

STL總結 迭代器

所有容器都定義了各自的迭代器 迭代器是乙個物件,它的工作是在容器中挑選元素,並將其呈現給迭代器使用者。迭代器分類 input迭代器 向前讀取 istream output迭代器 向前寫入 ostream forward迭代器 向前讀取和寫入 bidirectional迭代器 向前和向後讀取和寫入 l...

STL迭代器失效

vector 1.當插入 push back 乙個元素後,end操作返回的迭代器肯定失效。此時first和end操作返回的迭代器都會失效。3.當進行刪除操作 erase,pop back 後,指向刪除點的迭代器全部失效 指向刪除點後面的元素的迭代器也將全部失效。deque迭代器的失效情況 1.在de...