首页 > 代码库 > STL之list测试

STL之list测试

STL中list是一个双向链表,可高效的进行插入删除元素,list不支持随机访问,所以没有at(pos) and operator[];

下面是测试代码:

// ListTest.cpp : 定义控制台应用程序的入口点。///*时间:2014年11月24日 16:42:41目的:测试STL中list的基本使用方法。*/#include "stdafx.h"#include <iostream>#include <list>using namespace std;//全局变量list<int> g_list1;list<int> g_list2;//初始化全局变量 listvoid InitList(){	//在链表结尾插入	g_list1.push_back(11);	g_list1.push_back(12);	g_list1.push_back(13);	//在链表表头插入	g_list2.push_front(14);	g_list2.push_front(15);	g_list2.push_front(16);}//输出一个链表void ShowList(list<int>& listTemp){	//返回链表中元素的个数;	cout<<"元素个数为:"<<listTemp.size()<<endl;	list<int>::iterator it = listTemp.begin();//迭代器相当于一个指针。	for ( it = listTemp.begin(); it != listTemp.end();++it)	{		cout<<*it<<' ';	}	cout<<endl;}//测试构造函数void construct_test1(){	cout<<"无参数构造函数"<<endl;	list<int> listTest; //无参数构造函数	ShowList(listTest);}void construct_test2(){	cout<<"构造一个含有5个值为默认的0的链表"<<endl;	list<int> listTest(5); //长度为5  默认值为0的链表	ShowList(listTest);}//构造一个含有5个值为8的链表void construct_test3(){	cout<<"构造一个含有5个值为8的链表"<<endl;	list<int> listTest(5,8);//元素个数为5,值为8	ShowList(listTest);}// 构造函数,建一个g_list1的copy链表void construct_test4(){	cout<<"构造函数,建一个g_list1的copy链表"<<endl;	list<int> listTest(g_list1);	ShowList(listTest);}//构造函数,listTest含g_list2一个区域的元素[_First, _Last)void construct_test5(){	cout<<"构造函数,listTest含g_list2一个区域的元素[_First, _Last)"<<endl;	list<int> listTest(g_list2.begin(),g_list2.end());	ShowList(listTest);}//assign 重新分配值;有两个重载函数void assign_test(){	cout<<endl<<"assign Test:"<<endl;	list<int> listTest(5,1);	ShowList(listTest);	// void assign ( size_type n, const T& u );第一个重载函数	listTest.assign(4,3);	ShowList(listTest);	// void assign(InputIterator first, InputIterator end);第二个重载函数	listTest.assign(++g_list1.begin(),g_list1.end());	ShowList(listTest);}//测试 operator=void operator_equal_test(){	cout<<endl<<"测试operator="<<endl;	g_list1 = g_list2;	ShowList(g_list2);	g_list2.clear(); //仍然输出,说明是深拷贝	ShowList(g_list1);}//测试front 返回第一个元素的引用void front_test(){	cout<<endl<<"测试front 返回引用:"<<endl;	cout<<g_list1.front()<<endl;}//测试back 返回最后一个元素的引用,查看源代码:back有普通的函数还有一个const的函数*	reference back()		{	// return last element of mutable sequence			return (*(--end()));		}	const_reference back() const		{	// return last element of nonmutable sequence			return (*(--end()));		}*/void back_test(){	cout<<endl<<"测试back 返回最后一个元素的引用"<<endl;	cout<<g_list1.back()<<endl;	cout<<g_list2.back()<<endl;	list<int> const listTemp(4,5);	cout<<listTemp.back()<<endl; //可以单步调试,这里进入的是 const函数,因为listTemp是const类型的}//begin返回第一个元素的指针 begin也是有两个函数void begin_test(){	list<int>::iterator it1 = g_list1.begin();	cout<<*it1++<<endl;	*it1 = 99;	cout<<*it1<<endl;	list<int>::const_iterator it2 = g_list1.begin();	cout<<*++it2<<endl;	//*it2 = 88;//ERROR *it2 为const 不可修改,说明constr_iterator 中 const修饰的是 *it2;	list<int> const listTemp(3,888);	list<int>::const_iterator it3 = listTemp.begin();//进入的是begin的const函数	cout<<*it3<<endl;}//end()返回最后一个元素的下一位置的指针void end_test(){	list<int>::iterator it1 = g_list1.end();//注意是最后一个元素的下一位置的指针	//cout<<*it1<<endl;//程序终止 	cout<<*--it1<<endl;	//cout<<*++it1<<endl;//求end()的再下一个元素的值也是错误的 说明STL当中 list不是循环链表	g_list1.clear();	it1 = g_list1.begin();	list<int>::iterator it2 = g_list1.end();	if (it1 == it2)	{		cout<<"Yes!!"<<endl;	}}//rbegin()回传指向最后一个元素的反向 iteratorvoid rbegin_test(){	list<int>::reverse_iterator it = g_list1.rbegin();    	for (; it != g_list1.rend(); ++it)    	{        		cout << *it << ' ';    	}    	cout << endl;}//返回第一个元素的前一个我位置的指针void rend_test(){	list<int>::reverse_iterator it = g_list1.rend();	--it;	cout<<*it<<endl;}//删除链表尾的元素void pop_back_test(){	g_list1.pop_back();	ShowList(g_list1);}//删除链表表头的元素void pop_front_test(){	g_list2.pop_front();	ShowList(g_list2);}//删除所有元素void clear_test(){    	ShowList(g_list1);    	g_list1.clear();    	ShowList(g_list1);}//删除一个元素或者一个区域的元素(两个重载函数)
void earse_test(){	ShowList(g_list1);	g_list1.erase(g_list1.begin());	ShowList(g_list1);	cout<<endl;	ShowList(g_list2);	g_list2.erase(++g_list2.begin(),g_list2.end());	ShowList(g_list2);}//删除链表中匹配值的元素(匹配元素全部删除)void remove_test(){	ShowList(g_list1);	g_list1.push_back(1);	g_list1.push_back(1);	ShowList(g_list1);	g_list1.remove(1); //两个1都会被删除	ShowList(g_list1);	g_list1.remove(13);	ShowList(g_list1);}bool myFun(const int& value) { 	return (value < 12);}//remove_if()删除条件满足的元素(会遍历一次链表)void remove_if_test(){    	ShowList(g_list1);  	g_list1.remove_if(myFun);   	ShowList(g_list1);}//判断链表是否为空void empty_test(){	list<int> listTemp;	if (listTemp.empty())	{		cout<<"listTemp 为空"<<endl;	}	else	{		cout<<"listTemp不为空"<<endl;	}}//可能返回的最大长度void max_size_test(){	list<int>::size_type nMax = g_list1.max_size();	cout<<nMax<<endl;}//反转链表void reverse_test(){	ShowList(g_list1);	g_list1.reverse();	ShowList(g_list1);}//排序测试void sort_test(){	list<int> listTest;	listTest.push_back(2);	listTest.push_back(23);	listTest.push_back(32);	listTest.push_back(25);	listTest.push_back(332);	listTest.push_back(2333);	listTest.push_back(2231);	ShowList(listTest);	listTest.sort();	ShowList(listTest);}void unique_test(){	list<int> listTest;	listTest.push_back(2);	listTest.push_back(23);	listTest.push_back(23);	listTest.push_back(2);	listTest.push_back(32);	listTest.push_back(25);	listTest.push_back(332);	listTest.push_back(2333);	listTest.push_back(2231);	list<int> listTest2(listTest);	ShowList(listTest);	listTest.unique();//删除相邻重复元素,不相邻的重复元素不会删除	ShowList(listTest);	cout<<endl;	listTest.sort();	ShowList(listTest);	listTest.unique();	ShowList(listTest);	cout<<endl;	listTest2.sort();	ShowList(listTest2);	listTest2.unique();	ShowList(listTest2);	cout<<endl;}//插入函数 三个重载函数void insert_test(){	list<int> listTest(g_list1);	ShowList(listTest);	listTest.insert(listTest.begin(),66666);	ShowList(listTest);	cout<<endl;	list<int> listTest2(g_list1);	ShowList(listTest2);	listTest2.insert(listTest2.begin(),9,66666);	ShowList(listTest2);	cout<<endl;	list<int> listTest3(g_list1);	ShowList(listTest3);	listTest3.insert(listTest3.begin(),listTest2.begin(),listTest2.end());	ShowList(listTest3);	cout<<endl;}//交换两个链表void swap_test(){	ShowList(g_list1);	ShowList(g_list2);	cout<<endl;	g_list1.swap(g_list2);	ShowList(g_list1);	ShowList(g_list2);}//resize重新定义链表长度void resize_test(){    	ShowList(g_list1);    	g_list1.resize(9);        // 用默认值填补    	ShowList(g_list1);    	cout << endl;    	ShowList(g_list2);    	g_list2.resize(9, 51);    // 用指定值填补    	ShowList(g_list2);}int _tmain(int argc, _TCHAR* argv[]){	InitList();	//ShowList(g_list1);	//ShowList(g_list2);	//construct_test1();	//construct_test2();	//construct_test3();	//construct_test4();	//construct_test5();	//assign_test();	//operator_equal_test();	//front_test();	//back_test();	//begin_test();	//end_test();	//rbegin_test();	//rend_test();	//pop_back_test();	//pop_front_test();	//clear_test();	//earse_test();	 //remove_test();	//remove_if_test();	//empty_test();	//max_size_test();	//reverse_test();	//sort_test();	//unique_test();	//swap_test();	//insert_test();	resize_test();	getchar();	return 0;}

STL之list测试