1. 程式人生 > >c++ STL 之 deque

c++ STL 之 deque


 

#define VNAME(value) {cout<<(#value)<<":"<<endl;}

template<class T>
void print_elemnt(T &v)
{
	for(auto i : v)
		cout<<i<<" ";
	cout<<endl;
}

/************************************************************************/
/* 簡介:
 * deque是集vector和list集合的優點,訪問速度快,首尾插入速度快,因此,操作類似
 * 但是也有缺點,中間插入巨慢,因為和它的底層資料結構有關,多個塊連線起來的。
/************************************************************************/
void test_deque()
{
	deque<int> a;
	deque<int> b(4);	//分配4個數據,預設值為0
	deque<int> c(4,5);	//分配4個5
	deque<int> d(c.begin(),c.begin()+3);	//區間構造
	deque<int> e(b);	//拷貝構造
	deque<int> h;
	a = c;	

	/*
	迭代器:begin,end,rbegin,rend及對應的const
	 */
	
	cout<<" size of a is :"<<a.size()<<endl;
	cout<<" max_size of a is :"<<a.max_size()<<endl;
	cout<<" first element is :"<<a.front()<<endl;
	cout<<" first element is :"<<a[0]<<endl;
	cout<<" first element is :"<<a.at(0)<<endl;
	cout<<" last element is :"<<a.back()<<endl;
	
	//a.resize(n,val);
	//a.shrink_to_fit();
	//a.assign(n,val);		//賦值n個val給a
	//a.assign(c.begin(),c.begin()+2);

	b.push_back(9);
	b.push_front(1);
	b.pop_back();
	b.pop_front();

	auto npos = c.begin();
	//c.insert(npos,6);		//在npos位置插入6,插入之後注意迭代器失效問題
	c.insert(npos,3,6);	//在npos位置插入3個6 
	//c.insert(npos,d.begin(),d.begin()+2);

	auto ipos = c.begin();
	c.emplace(ipos,1,2,3);	//emplace引數可變

	VNAME(h);
	print_elemnt(h);
	h.emplace_front(34);
	h.emplace_back(65,45);
	print_elemnt(h);
	/*
	*emplace() 和 insert()
	*前者可以插入多個數據,省去多次構造臨時變數;後者插入資料的副本
	 */

	auto jpos = a.begin();
	a.erase(jpos);	//刪除一個或者一段區間[,),返回指向下一個元素的迭代器,遍歷時不要弄錯了

	a.swap(b);	//交換資料
	a.clear();	//清空資料
	if(a.empty())
	{
		cout<<"a is empty"<<endl;
	}

	VNAME(a);
	print_elemnt(a);
	VNAME(b);
	print_elemnt(b);
	VNAME(c);
	print_elemnt(c);
	VNAME(d);
	print_elemnt(d);
	VNAME(e);
	print_elemnt(e);

	cout<<endl<<endl;
}