C++ 中有三類疊代器,分别是插入疊代器(inserter),反向疊代器(reverse_iterator)和流疊代器.
這裡(vs2003為例)介紹插入疊代器,插入疊代器分别是std::inserter_iterator,std::back_inserter_iterator,std::front_inserter_iterator 三類,對應的疊代器擴充卡應該是
std::inserter,std::back_inserter,std::front_inserter 。
1. std::inserter_iterator(std::inserter)
// TEMPLATE FUNCTION inserter
template<class _Container,
class _Iter> inline
insert_iterator<_Container> inserter(_Container& _Cont, _Iter _Where)
{ // return insert_iterator
return (std::insert_iterator<_Container>(_Cont, _Where));
}
這是是正常的插入疊代器擴充卡的實作,我們看到函數需要指定容器類型和容器的開始指針(從那個位置開始插入)傳回了一個按容器和容器疊代器位置構造出來的疊代器。我們以一個調用例子來說明這個。
std::vector<std::string> v1,v2;
std::copy(v1.begin(),v1.end(),std::inserter(v2,v2.begin()));
這裡表示需要把v1的所有元素插入到v2裡面。調用的時序是先構造一個std::inserter 的執行個體A(命名為A),然後通過 std::copy 裡面的循環,不斷的調用擴充卡A的指派運算符号,将v1 裡面的元素指派給v2。我們來看 std::insert_iterator 的實作,
template<class _Container>
class insert_iterator
: public _Outit
{ // wrap inserts into container as output iterator
public:
typedef _Container container_type;
typedef typename _Container::reference reference;
insert_iterator(_Container& _Cont, typename _Container::iterator _Where)
: container(&_Cont), iter(_Where)
{ // construct with container and iterator
}
insert_iterator<_Container>& operator=(
typename _Container::const_reference _Val)
{ // insert into container and increment stored iterator
iter = container->insert(iter, _Val);
++iter;
return (*this);
//...省略了insert_iterator其他的函數
看到
insert_iterator<_Container>& operator=(
這裡通過傳入容器和容器的疊代器,先構造了執行個體,指派運算符實際是調用了容器的 container->insert 方法,是以,這裡必須需要容器有insert 方法。幸好,幾乎所有容器都有insert 方法,是以這個是通用的疊代器。這個insert 方法還必須類似這樣聲明:
iterator insert(iterator _Where, const _Ty& _Val);
傳回一個疊代器,傳入位置和值。
2. std::back_inserter_iterator(std::back_inserter)
顧名思義,back_inserter就是在容器的後面插入,實際 back_inserter 的實作和 inserter 基本一樣,因為是指定在最後面插入,是以不需要指定插入容易的開始疊代器;
template<class _Container> inline
back_insert_iterator<_Container> back_inserter(_Container& _Cont)
{ // return a back_insert_iterator
return (std::back_insert_iterator<_Container>(_Cont));
我們來看 std::back_insert_iterator 的實作,
// TEMPLATE CLASS back_insert_iterator
class back_insert_iterator
{ // wrap pushes to back of container as output iterator
explicit back_insert_iterator(_Container& _Cont)
: container(&_Cont)
{ // construct with container
back_insert_iterator<_Container>& operator=(
{ // push value into container
container->push_back(_Val);
//...省略了back_insert_iterator其他的函數
我們同樣通過一個調用來看,
std::vector<std::string> v1,v2;
std::copy(v1.begin(),v1.end(),std::back_inserter(v2));
這裡通過傳入容器,先構造了執行個體,指派運算符實際是調用了容器的 container->push_back 方法,是以,這裡必須需要容器有push_back 方法,是以這個對關聯容器 std::map,std::muitlmap 就無效了。
3. std::front_inserter_iterator(std::front_inserter)
顧名思義,front_inserter 就是在容器的前面插入,實際 front_inserter 的實作和 back_inserter 基本一樣,因為是指定在最前面插入,是以不需要指定插入容易的開始疊代器;
// TEMPLATE FUNCTION front_inserter
front_insert_iterator<_Container> front_inserter(_Container& _Cont)
{ // return front_insert_iterator
return (std::front_insert_iterator<_Container>(_Cont));
我們來看 std::front_insert_iterator 的實作,
// TEMPLATE CLASS front_insert_iterator
class front_insert_iterator
{ // wrap pushes to front of container as output iterator
explicit front_insert_iterator(_Container& _Cont)
front_insert_iterator<_Container>& operator=(
container->push_front(_Val);
//...省略了front_insert_iterator其他的函數
我們同樣通過一個調用來看,
std::list<std::string> list_1,list_2;
std::copy(v1.begin(),v1.end(),std::front_inserter(list_2));
這裡通過傳入容器,先構造了執行個體,指派運算符實際是調用了容器的 container->push_front 方法,是以,這裡就要求容器必須有 push_front 方法,是以這個對關聯容器 std::map,std::muitlmap,std::vector 都無效了,
這個對于std::deque,std::queue,std::list 這類有先後順序的比較有效了。