STL容器总结之list
在使用std::list<>链表时,难免会对数据进行添加删除操作。而遍历链表则有两种方式:通过索引访问,象数组一样处理;通过std::list<>::iterator链表遍历器进行访问
STL 中的list 就是一 双向链表,可高效地进行插入删除元素。
list不支持随机访问。所以没有 at(pos)和operator[]。
list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) 。list< int>::iterator it;
1.构造,析构
- list<Elem> c
-
- list<Elem> c1(c2)
-
- list<Elem>c(n)
-
- list<Elem>c(n,elem)
-
- list<Elem>c(begin,end)
-
- c.~list();
2.其他
- c.size()
-
- c.swap(c2)
-
- c.empty()
-
- c.max_size()
-
- c.resize(num)
-
- c.reverse()
-
- c.sort()
-
- list 对象L1(4,3,5,1,4)
- L1.sort( );
- L1.sort( greater <int >() );
-
- c.merge()
-
-
- list1.merge(list2);
-
- L1( 3,2,1), L2(6,5,4)
- L1.merge(L2, greater <int >() );
-
- c.splice()
-
- list1.splice( ++list1.begin(),list2);
-
- list1.splice( ++list1.begin(),list2,list2.begin());
-
- list1.splice( ++list1.begin(),list2,++list2.begin(),list2.end());
-
3.赋值
- c.assign(begin,end)
-
- c.assign(n,Elem)
-
- c.swap(c2)
4.数据访问
- c.front()
-
- c.back()
-
- c.begin()
-
- c.end()
-
- c.rbegin()
-
- c.rend()
-
5.插入数据
- c.push_back(Elem)
-
- c.push_front(Elem)
-
- c.insert(pos,Elem)
-
- c.insert(pos,n,Elem)
-
- c.insert(pos,begin,end)
6.删除数据
- c.pop_back()
-
- c.pop_front()
-
- c.remove(Elem)
-
-
-
-
- void remove_if_test(){
- ShowList(g_list1);
- g_list1.remove_if(myFun);
- ShowList(g_list1);
- }
-
- c.clear()
-
- c.erase(pos)
-
- c.erase(begin,end)
-
- c.unique()
-
- L1( 1, 1 ,4,3,5,1)
- L1.unique( );
7.示例
- #include<iostream>
- #include<stdio.h>
- #include<list>
- using namespace std;
- list < int > g_list1;
- list < int > g_list2;
-
-
-
- void InitList(){
-
- g_list1.push_back( 1 );
- g_list1.push_back( 2 );
- g_list1.push_back( 3 );
-
- g_list2.push_front( 6 );
- g_list2.push_front( 5 );
- g_list2.push_front( 4 );
- }
-
-
-
- void ShowList(list < int >& listTemp){
-
- cout << listTemp.size() << endl;
-
- for (list < int > ::iterator it = listTemp.begin(); it != listTemp.end(); ++ it){
- cout << * it << ' ' ;
- }
- cout << endl;
- }
-
-
-
- void constructor_test0(){
- list < int > listTemp;
- cout << listTemp.size() << endl;
- }
-
-
-
- void constructor_test1(){
- list < int > listTemp( 3 );
- ShowList(listTemp);
- }
-
-
-
- void constructor_test2(){
- list < int > listTemp( 5 , 1 );
- ShowList(listTemp);
- }
-
-
-
- void constructor_test3(){
- list < int > listTemp(g_list1);
- ShowList(listTemp);
- }
-
-
-
- void constructor_test4(){
- list < int > listTemp(g_list1.begin(), g_list1.end());
- ShowList(listTemp);
- }
-
-
-
-
-
-
- void assign_test(){
- list < int > listTemp( 5 , 1 );
- ShowList(listTemp);
- listTemp.assign( 4 , 3 );
- ShowList(listTemp);
-
- listTemp.assign( ++ g_list1.begin(), g_list1.end());
- ShowList(listTemp);
- }
-
-
-
- void operator_equality_test(){
- g_list1 = g_list2;
- ShowList(g_list1);
- ShowList(g_list2);
- }
-
-
-
- void front_test7(){
- cout << g_list1.front() << endl;
- }
-
-
-
- void back_test(){
- cout << g_list1.back() << endl;
- }
-
-
-
- void begin_test(){
- list < int > ::iterator it1 = g_list1.begin();
- cout << *++ it1 << endl;
-
- list < int > ::const_iterator it2 = g_list1.begin();
- it2 ++ ;
-
- cout << * it2 << endl;
-
- }
-
-
-
- void end_test(){
- list < int > ::iterator it = g_list1.end();
- -- it;
- cout << * it << endl;
- }
-
-
-
- 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 push_back_test(){
- ShowList(g_list1);
- g_list1.push_back( 4 );
- ShowList(g_list1);
- }
-
-
-
- void push_front_test(){
- ShowList(g_list1);
- g_list1.push_front( 4 );
- ShowList(g_list1);
- }
-
-
-
- void pop_back_test(){
- ShowList(g_list1);
- cout << endl;
-
- g_list1.pop_back();
- ShowList(g_list1);
-
- }
-
-
-
- void pop_front_test(){
- ShowList(g_list1);
- cout << endl;
-
- g_list1.pop_front();
- ShowList(g_list1);
- }
-
-
-
- void clear_test(){
- ShowList(g_list1);
- g_list1.clear();
- ShowList(g_list1);
- }
-
-
-
- void erase_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 );
- ShowList(g_list1);
-
- g_list1.remove( 1 );
- ShowList(g_list1);
- }
-
- bool myFun( const int & value) { return (value < 2 ); }
-
-
-
- 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 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);
- }
-
-
-
- void reverse_test(){
- ShowList(g_list1);
- g_list1.reverse();
- ShowList(g_list1);
- }
-
-
-
- void sort_test(){
- list < int > listTemp;
- listTemp.push_back( 9 );
- listTemp.push_back( 3 );
- listTemp.push_back( 5 );
- listTemp.push_back( 1 );
- listTemp.push_back( 4 );
- listTemp.push_back( 3 );
-
- ShowList(listTemp);
- listTemp.sort();
- ShowList(listTemp);
-
- listTemp.sort(greater < int > ());
- ShowList(listTemp);
- }
-
-
-
- void merge_test1(){
- list < int > listTemp2;
- listTemp2.push_back( 3 );
- listTemp2.push_back( 4 );
-
- list < int > listTemp3;
- listTemp3.push_back( 9 );
- listTemp3.push_back( 10 );
-
- ShowList(listTemp2);
- cout << endl;
- ShowList(listTemp3);
- cout << endl;
-
- listTemp2.merge(listTemp3);
- ShowList(listTemp2);
- }
-
- bool myCmp ( int first, int second)
- { return ( int (first) > int (second) ); }
-
-
-
- void merge_test2(){
- list < int > listTemp2;
- listTemp2.push_back( 4 );
- listTemp2.push_back( 3 );
-
- list < int > listTemp3;
- listTemp3.push_back( 10 );
- listTemp3.push_back( 9 );
-
- ShowList(listTemp2);
- cout << endl;
- ShowList(listTemp3);
- cout << endl;
-
-
- listTemp2.merge(listTemp3, myCmp);
- ShowList(listTemp2);
- }
-
-
-
-
-
-
- void splice_test(){
- list < int > listTemp1(g_list1);
- list < int > listTemp2(g_list2);
-
- ShowList(listTemp1);
- ShowList(listTemp2);
- cout << endl;
-
-
- listTemp1.splice( ++ listTemp1.begin(), listTemp2);
- ShowList(listTemp1);
- ShowList(listTemp2);
-
-
- listTemp1.assign(g_list1.begin(), g_list1.end());
- listTemp2.assign(g_list2.begin(), g_list2.end());
- listTemp1.splice( ++ listTemp1.begin(), listTemp2, ++ listTemp2.begin());
- ShowList(listTemp1);
- ShowList(listTemp2);
-
-
- listTemp1.assign(g_list1.begin(), g_list1.end());
- listTemp2.assign(g_list2.begin(), g_list2.end());
- listTemp1.splice( ++ listTemp1.begin(), listTemp2, ++ listTemp2.begin(), listTemp2.end());
- ShowList(listTemp1);
- ShowList(listTemp2);
-
- }
-
-
-
-
-
-
-
- void insert_test(){
- list < int > listTemp1(g_list1);
- ShowList(listTemp1);
- listTemp1.insert(listTemp1.begin(), 51 );
- ShowList(listTemp1);
- cout << endl;
-
- list < int > listTemp2(g_list1);
- ShowList(listTemp2);
- listTemp2.insert(listTemp2.begin(), 9 , 51 );
- ShowList(listTemp2);
- cout << endl;
-
- list < int > listTemp3(g_list1);
- ShowList(listTemp3);
- listTemp3.insert(listTemp3.begin(), g_list2.begin(), g_list2.end());
- ShowList(listTemp3);
-
- }
-
-
-
- void swap_test(){
- ShowList(g_list1);
- ShowList(g_list2);
- cout << endl;
-
- g_list1.swap(g_list2);
- ShowList(g_list1);
- ShowList(g_list2);
- }
-
- bool same_integral_part ( double first, double second)
- { return ( int (first) == int (second) ); }
-
-
-
- void unique_test(){
- list < int > listTemp;
- listTemp.push_back( 1 );
- listTemp.push_back( 1 );
- listTemp.push_back( 4 );
- listTemp.push_back( 3 );
- listTemp.push_back( 5 );
- listTemp.push_back( 1 );
- list < int > listTemp2(listTemp);
-
- ShowList(listTemp);
- listTemp.unique();
- ShowList(listTemp);
- cout << endl;
-
- listTemp.sort();
- ShowList(listTemp);
- listTemp.unique();
- ShowList(listTemp);
- cout << endl;
-
- listTemp2.sort();
- ShowList(listTemp2);
- listTemp2.unique(same_integral_part);
- ShowList(listTemp2);
-
- }
-
-
-
- int main(){
- InitList();
- ShowList(g_list1);
- ShowList(g_list2);
-
- constructor_test0();
- constructor_test1();
- constructor_test2();
- constructor_test3();
- constructor_test4();
- assign_test();
- operator_equality_test();
- front_test7();
- back_test();
- begin_test();
- end_test();
- rbegin_test();
- rend_test();
- push_back_test();
- push_front_test();
- pop_back_test();
- pop_front_test();
- clear_test();
- erase_test();
- remove_test();
- remove_if_test();
- empty_test();
- max_size_test();
- resize_test();
- reverse_test();
- sort_test();
- merge_test1();
- merge_test2();
- splice_test();
- insert_test();
- swap_test();
- unique_test();
- return 0 ;
- }
参考博客: http://blog.csdn.net/lanyzh0909/article/details/7567696