标签: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;
}
标签:style io ar color os 使用 sp for on
原文地址:http://blog.csdn.net/djb100316878/article/details/41447235