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

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();

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

上代码

#include <iostream>
#include <list>
#include <algorithm>

#include <stdlib.h>
#include <string.h>

typedef struct info_s
{
int nNumber;
bool operator==(struct info_s b) const
{
return this->nNumber == b.nNumber;
}

bool operator!=(struct info_s b) const
{
return this->nNumber != b.nNumber;
}

bool operator>=(struct info_s b) const
{
return this->nNumber >= b.nNumber;
}

bool operator<=(struct info_s b) const
{
return this->nNumber <= b.nNumber;
}

bool operator>(struct info_s b) const
{
return this->nNumber > b.nNumber;
}

bool operator<(struct info_s b) const
{
return this->nNumber < b.nNumber;
}

}info_t;

typedef std::list< info_t > list_t;

void append(list_t &List, info_t &info)
{
std::cout<<"***append****"<<std::endl;
List.push_back(info);
}

void for_each(list_t &List)
{
std::cout<<"***for_each****"<<std::endl;
list_t::iterator iter;
for(iter = List.begin(); iter != List.end() ;iter++)
{
std::cout<< iter->nNumber <<std::endl;
}
}

void del_end_info(list_t &List)
{
std::cout<<"***del_end_info****"<<std::endl;
if(! List.empty())
{
List.pop_back();
}
}

void for_each_delete(list_t &List)
{
list_t::iterator iter;
for(iter = List.begin(); iter != List.end() ;)
{
std::cout<< "delete before iter->number:"<<iter->nNumber <<std::endl;
iter = List.erase(iter);
std::cout<< "delete after iter->number:"<< iter->nNumber <<std::endl;
}

}

int insert_one(list_t &List , info_t &info, int iPlace)
{
int i = 0;

std::cout<<"insert_one"<<std::endl;
if(iPlace < 0)
{
std::cout<<"insert_one param error"<<std::endl;
return -1;
}

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

while(iter != List.end())
{
//std::cout<<" dump "<< (*iVector)<<std::endl;
if(i == iPlace)
{
iter = List.insert(iter , info); //此时insert的返回值是迭代器,插入成功后iVector指向插入的位置
std::cout<<" insert_one after List point "<<iter->nNumber <<std::endl;
return 0;
}

i++;
++iter;
}

iter = List.insert(List.end() , info);

return 0;
}

void find_one(list_t &List,info_t info )
{

std::cout<<"find_one"<<std::endl;

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;
}

}

void Sort(list_t & List)
{
std::cout<<"Sort it"<<std::endl;
List.sort();
for_each(List);
}

int main()
{
//初始化
list_t List;
info_t info;
memset(&info, 0, sizeof(info_t));

//添加
info.nNumber = 8;
append(List, info);

info.nNumber = 5;
append(List, info);

info.nNumber = 7;
append(List, info);

info.nNumber = 1;
append(List, info);

info.nNumber = 1;
append(List, info);

info.nNumber = 2;
append(List, info);

info.nNumber = 1;
append(List, info);

//遍历
for_each(List);

//插入
info.nNumber = 80;
insert_one(List,info,3);
for_each(List);
//查找
find_one(List,info);

//排序
Sort(List);

//删除末尾
del_end_info(List);
for_each(List);

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

//删除所有
// List.clear();
for_each_delete(List);
for_each(List);
std::cout<< " size:"<<List.size()<<std::endl;

return 0;
}

---------------------
作者:zhouzhenhe2008
来源:CSDN
原文:https://blog.csdn.net/zhouzhenhe2008/article/details/77428743/
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/lyp-Bird/p/10376537.html

时间: 2024-10-05 17:47:53

[转]C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放的相关文章

单链表 初始化 创建 头插法 尾插法 插入 删除 查找 合并 长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(LNode) #

顺序表 初始化 插入 删除 查找 合并 交换 判断为空 求长度

#include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define ERROR -1 #define FALSE -1 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(SqList) #define MLC (Li

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

使用STL map 用 string 做索引 插入删除数据

1.代码 1 #include <map> 2 #include <string> 3 #include <stdio.h> 4 #include <vector> 5 #include <stdlib.h> 6 7 using namespace std; 8 9 class A 10 { 11 public: 12 int m_iX; 13 14 public : 15 A(); 16 A(int i); 17 ~A(); 18 }; 19

*三维数组的初始化及遍历三个for循环

package com.chongrui.test; /* *三维数组的初始化及遍历 * */ public class test { public static void main(String[] args) { int a[][][]=new int[][][]{ {{1,2,3},{4,5,6}}, {{8,9,10},{11,12,13}}, {{14,15,16},{17,18,19,20}}, }; for(int i=0;i<a.length;i++){ System.out.p

vector的几种初始化和遍历

随着C++11标准的出现,vector出现了新的初始化和遍历用法,但是vs2010和较高版本并没有能完全支持C++11标准,所以我就将它的所有的用法归纳了一下. vector的初始化 vector基本初始化如下: vector< T >v1 v1是一个空的vector vector< T >v2(v1) v2包含v1所有元素,等价于vector v2=v1; vector< T >v3(n,val) v3包含了n个重复元素,每个元素是val 在C++11标准中出现了下面

&lt;27&gt;【理解】02-结构体数组概念及定义+【掌握】03-结构数组的初始化和遍历

[理解]02-结构体数组概念及定义 结构体数组: 用来存放大量的结构体相同的结构体变量 结构体数组定义: 结构体数组定义的第一种方式: 1)定义结构体的同时,定义数组 struct Student{ int age; char *name; int s_no; float score; }stu[5]; 结构体数组定义的第二种方式 2)先定义结构体,后定义数组 struct Student boy[5]; #include <stdio.h> int main(int argc, const

第三讲.继承,完整初始化方法,遍历构造器,多态(代码) 另附植物大战僵尸练习

//初始化和遍历构造器使用 //person.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 5 { 6 7 NSString *_name; 8 int _age; 9 NSString *_sex; 10 11 12 } 13 14 +(id)PersonWithName:(NSString*)name age:(int)age; 15 -(id)initWithName:(NSStrin

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)