码迷,mamicode.com
首页 > 其他好文 > 详细

STL之list测试

时间:2014-11-24 17:14:39      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:style   io   ar   color   os   使用   sp   for   on   

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;

//初始化全局变量 list
void 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()回传指向最后一个元素的反向 iterator
void 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测试

标签:style   io   ar   color   os   使用   sp   for   on   

原文地址:http://blog.csdn.net/djb100316878/article/details/41447235

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!