1. 程式人生 > >c++迭代器詳解(一):back_inserter, front_inserter,inserter

c++迭代器詳解(一):back_inserter, front_inserter,inserter

1.stl迭代器之配接器( Iterator Adapters)
迭代器(Iterators)是一個純抽象的概念:任何東西,只要其行為類似迭代器,它就是一個迭代器.也就是說,只有具備有迭代器的四種基本操作:取值(*),遞增(++)
比較(== !=) 賦值(=)它就是迭代器。因此,你可以自己寫一些類別(classes),具備迭代器介面,但有著各不相同的行為。c++標準庫中提供了數個預先定義的特需迭代器

也就是所謂的迭代器配接器(Iterator Adapters).迭代器配接器不僅起到了輔助作用,還能賦予整個迭代器抽象概念更強大的能力。

2.下面簡介三種迭代器配接器(iterator Adapters):(1)insert iterators(安插型迭代器)(2)stream iterators (流迭代器)(3)reverse iterators (逆向迭代器)詳細資訊可參考《c++ 標準程式庫》第7.4節。

1.安插型迭代器(insert iterators)
安插型迭代器可以使演算法以安插(insert)方向而非覆寫(overwrite)方式運作。使用它可以解決目標空間不足問題。也就是說,安插型迭代器會促使目標區間的大小按需要
增長。安插型迭代器內部將介面重新做了定義:如果你對容器中的某個資料元素設值(assign),會引發“對其所屬的容器內的資料元素的安插(insert)操作”至於插入的位置

是在容器的最前還是最後,或是特定的位置,它根據三種不同的安插型迭代器(insert iterators)而定。單步前進(step forward)不會造成任何動靜(是一個no-op)

1)back_inserter(container):使用push_back()在容器尾端安插元素,元素排列順序和安插順序相同。只有在提供了push_back()成員函式的容器才能使back_inserter(container)這樣的容器有:vector,deque,list
2)front_inserter(container):在內部呼叫push_front()成員函式,將元素安插於容器中最前端。採用頭插法插入元素,資料元素在容器中的位置和插入時的順序剛好相反。同樣,只有提供了push_front()成員函式的容器才能使用 front_inserter(container)這樣的迭代器有:deque,list.
3)inserter(container,pos):在內部呼叫insert()成員函式,將元素插入第二個引數所指的位置。因為在stl所有的容器中都包含有insert()成員函式,所以所有的容器包括關聯式容器都能夠使用 inserter(container, pos).但是,我們知道關聯式容器中資料元素是有序的,資料元素在容器中的位置只是和元素值有關。在關聯式容器中,提供一個迭代器只是告訴容器確定從什麼地方開始搜尋正確的位置,如果提示不正確的話,效率比沒有提示更糟,所以對關聯式容器來說,我們必須慎重 

3.c++程式碼解釋:以back_inserter()為例

#include<iostream>
#include<vector>
#include<deque>
#include<set>
#include<list>
#include<algorithm>
#include<iterator>
using namespace std;
int main( int argc ,char **argv)
{
	list<int> int_list;

	//insert elements from 1 to 9 into the first collection : int_list
	for(int i = 1; i <= 9 ; ++i)
		int_list.push_back(i);

	//printf all the elements in the int_list
	list<int>::iterator list_pos;
	cout<<"elements in the int_list now: ";
	for( list_pos = int_list.begin(); list_pos != int_list.end(); ++list_pos)
		cout << *list_pos << ' ';
		cout << endl;

	//copy all the elements of int_list into int_vector by appending them
	vector<int> int_vector;
	copy(int_list.begin(),int_list.end(),back_inserter(int_vector));
	//printf all the elements int the  int_vector
	vector<int>::iterator pos_vector;
	cout<<"elements in the int_vector:";
	for( pos_vector = int_vector.begin(); pos_vector != int_vector.end();++pos_vector)
		cout<< *pos_vector << ' ';
	cout<< endl;

	//copy all the elements of int_list into int_set
	//only inserter that works for associative containers
	set<int> int_set;
	copy(int_list.begin(),int_list.end(),inserter(int_set,int_set.begin()));
	set<int>:: iterator pos_printf_list;
	cout<<"elements of int_set now:";
	for(pos_printf_list = int_set.begin(); pos_printf_list != int_set.end(); ++pos_printf_list)
		cout<< *pos_printf_list << ' ';
		cout<< endl;

	return 0;
}

4.結果: