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...