C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放

转载:https://blog.csdn.net/zhouzhenhe2008/article/details/77428743/

list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。

使用list容器之前必须加上STL的list容器的头文件:#include<list>;

 

list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using namespace std;

 

(1)初始化

typedef struct info_s

{

int nNumber;

 

}info_t;

 

typedef std::list< info_t > list_t;

 

定义list的类型

list_t  List;  //定义一个空的链表

list_t  List(count); //建一个含count个默认值是0的元素的链表

list_t  List(count, info); //建一个含count个默认值是info的元素的链表

list_t  List(List2);   //建一个的copy链表

list_t  List(List2.begin(),List2.end());   //含区间的元素[First,Last]

 

(2)添加(添加到末尾)

 

info_t info;

//Set(info)

 

List.push_back(info);

将会添加到末尾

 

(3)遍历

list_t::iterator iter;

for(iter = List.begin(); iter != List.end() ;iter++)

{

std::cout<< iter->nNumber <<std::endl;

}

 

 

(4)删除末尾元素

c++的stl list 提供pop_back()函数来删除最后一个元素。

List.pop_back();

 

(5)删除所有元素

 

简单粗暴的方法:调用clear()

List.clear();

 

遍历删除法,一个一个删除,这样的好处是,如果元素有申请内容或者系统资源,我们可以把他释放了,避免资源泄漏。

list_t::iterator iter;

for(iter = List.begin(); iter != List.end() ;)

{

//这里可以做是否内存或者资源的操作

//

iter =  List.erase(iter);  

//iter指向了下一个元素

}

 

 

(6)插入

 

iter = List.insert(iter , info);

 

插入后iter指向新插入的元素。

 

(7)查找

list_t::iterator iter ;

iter = std::find(List.begin(),List.end(), info);

if(iter != List.end())

{

std::cout<<"find it"<<std::endl;

}

else

{

std::cout<<"not find it"<<std::endl;

}

 

 

注意结构体需要重载==运算符

(8)排序

 

List.sort();

注意,结构体需要重载运算符<

 

 

上代码

 

 
  1. #include <iostream>

  2. #include <list>

  3. #include <algorithm>

  4.  
  5. #include <stdlib.h>

  6. #include <string.h>

  7.  
  8. typedef struct info_s

  9. {

  10. int nNumber;

  11. bool operator==(struct info_s b) const

  12. {

  13. return this->nNumber == b.nNumber;

  14. }

  15.  
  16. bool operator!=(struct info_s b) const

  17. {

  18. return this->nNumber != b.nNumber;

  19. }

  20.  
  21. bool operator>=(struct info_s b) const

  22. {

  23. return this->nNumber >= b.nNumber;

  24. }

  25.  
  26. bool operator<=(struct info_s b) const

  27. {

  28. return this->nNumber <= b.nNumber;

  29. }

  30.  
  31. bool operator>(struct info_s b) const

  32. {

  33. return this->nNumber > b.nNumber;

  34. }

  35.  
  36. bool operator<(struct info_s b) const

  37. {

  38. return this->nNumber < b.nNumber;

  39. }

  40.  
  41. }info_t;

  42.  
  43. typedef std::list< info_t > list_t;

  44.  
  45. void append(list_t &List, info_t &info)

  46. {

  47. std::cout<<"***append****"<<std::endl;

  48. List.push_back(info);

  49. }

  50.  
  51. void for_each(list_t &List)

  52. {

  53. std::cout<<"***for_each****"<<std::endl;

  54. list_t::iterator iter;

  55. for(iter = List.begin(); iter != List.end() ;iter++)

  56. {

  57. std::cout<< iter->nNumber <<std::endl;

  58. }

  59. }

  60.  
  61. void del_end_info(list_t &List)

  62. {

  63. std::cout<<"***del_end_info****"<<std::endl;

  64. if(! List.empty())

  65. {

  66. List.pop_back();

  67. }

  68. }

  69.  
  70. void for_each_delete(list_t &List)

  71. {

  72. list_t::iterator iter;

  73. for(iter = List.begin(); iter != List.end() ;)

  74. {

  75. std::cout<< "delete before iter->number:"<<iter->nNumber <<std::endl;

  76. iter = List.erase(iter);

  77. std::cout<< "delete after iter->number:"<< iter->nNumber <<std::endl;

  78. }

  79.  
  80. }

  81.  
  82.  
  83. int insert_one(list_t &List , info_t &info, int iPlace)

  84. {

  85. int i = 0;

  86.  
  87. std::cout<<"insert_one"<<std::endl;

  88. if(iPlace < 0)

  89. {

  90. std::cout<<"insert_one param error"<<std::endl;

  91. return -1;

  92. }

  93.  
  94. list_t::iterator iter = List.begin();

  95.  
  96. while(iter != List.end())

  97. {

  98. //std::cout<<" dump "<< (*iVector)<<std::endl;

  99. if(i == iPlace)

  100. {

  101. iter = List.insert(iter , info); //此时insert的返回值是迭代器,插入成功后iVector指向插入的位置

  102. std::cout<<" insert_one after List point "<<iter->nNumber <<std::endl;

  103. return 0;

  104. }

  105.  
  106. i++;

  107. ++iter;

  108. }

  109.  
  110.  
  111. iter = List.insert(List.end() , info);

  112.  
  113. return 0;

  114. }

  115.  
  116.  
  117. void find_one(list_t &List,info_t info )

  118. {

  119.  
  120. std::cout<<"find_one"<<std::endl;

  121.  
  122. list_t::iterator iter ;

  123.  
  124. iter = std::find(List.begin(),List.end(), info);

  125.  
  126. if(iter != List.end())

  127. {

  128. std::cout<<"find it"<<std::endl;

  129. }

  130. else

  131. {

  132. std::cout<<"not find it"<<std::endl;

  133. }

  134.  
  135. }

  136.  
  137. void Sort(list_t & List)

  138. {

  139. std::cout<<"Sort it"<<std::endl;

  140. List.sort();

  141. for_each(List);

  142. }

  143.  
  144. int main()

  145. {

  146. //初始化

  147. list_t List;

  148. info_t info;

  149. memset(&info, 0, sizeof(info_t));

  150.  
  151. //添加

  152. info.nNumber = 8;

  153. append(List, info);

  154.  
  155. info.nNumber = 5;

  156. append(List, info);

  157.  
  158. info.nNumber = 7;

  159. append(List, info);

  160.  
  161. info.nNumber = 1;

  162. append(List, info);

  163.  
  164. info.nNumber = 1;

  165. append(List, info);

  166.  
  167. info.nNumber = 2;

  168. append(List, info);

  169.  
  170. info.nNumber = 1;

  171. append(List, info);

  172.  
  173. //遍历

  174. for_each(List);

  175.  
  176. //插入

  177. info.nNumber = 80;

  178. insert_one(List,info,3);

  179. for_each(List);

  180. //查找

  181. find_one(List,info);

  182.  
  183. //排序

  184. Sort(List);

  185.  
  186. //删除末尾

  187. del_end_info(List);

  188. for_each(List);

  189.  
  190. std::cout<< " size:"<<List.size()<<std::endl;

  191.  
  192. //删除所有

  193. // List.clear();

  194. for_each_delete(List);

  195. for_each(List);

  196. std::cout<< " size:"<<List.size()<<std::endl;

  197.  
  198.  
  199. return 0;

  200. }

  201.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值