热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

C++语言STL容器list总结

这篇文章主要介绍了C++语言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::iterator it;

构造,析构

list c //创建一个空的list 

list c1(c2) //复制另一个同类型元素的list 

listc(n) //创建n个元素的list,每个元素值由默认构造函数确定 

listc(n,elem) //创建n个元素的list,每个元素的值为elem 

listc(begin,end) //由迭代器创建list,迭代区间为[begin,end) 

c.~list();       // 销毁所有元素,释放内存 

### 其他###

c.size() //返回容器的元素个数 

c.swap(c2) //将c2和c的元素互换 

c.empty() //判断容器是否为空 

c.max_size() //返回容器中最大数据的数量 

c.resize(num) //重新指定链表的长度 

c.reverse() //反转链表 

c.sort() //对列表进行排序,默认升序,可以自定义回调函数 
//示例 
list 对象L1(4,3,5,1,4) 
L1.sort( );         // L1(1,3,4,4,5) 
L1.sort( greater () ); // L1(5,4,4,3,1) 

c.merge() //合并两个有序列表使之有序 
//示例 
// 升序 
list1.merge(list2); // list1(1,2,3,4,5,6) list2 现为空 
// 降序 
L1( 3,2,1), L2(6,5,4) 
L1.merge(L2, greater () );
// list1(6,5,4,3,2,1) list2 现为空 

c.splice() 
//对两个链表进行结合( 三个重载函数) 结合后第二个链表清空 


//示例 
list1.splice( ++list1.begin(),list2); 
// list1(1,4,5,6,2,3) list2 为空 
 list1.splice( ++list1.begin(),list2,list2.begin()); 
// list1( 1,4,2,3); list2(5,6) 
list1.splice( ++list1.begin(),list2,++list2.begin(),list2.end()); 
//list1( 1, 5,6, 2,3); list2(4) 

### 赋值###

c.assign(begin,end) //将[begin,end)区间中的数据赋值给c 

c.assign(n,Elem) //将n个Elem的拷贝赋值给c 

c.swap(c2) //将c2和c的元素互换 

### 数据访问###

c.front() //返回第一个数据 

c.back() //返回最后一个数据 

c.begin() //返回指向第一个元素的迭代器(指针) 

c.end() //返回指向最后一个数据的下一个位置的迭代器(指针) 

c.rbegin() 
//返回逆向队列的第一个数据,也就是返回容器中倒数第一个元素的迭代器 

c.rend() 
//返回指向逆向队列的最后一个数据的下一个位置的迭代器, 
//也就是返回容器中倒数最后一个元素之后的迭代器 

### 插入数据###

c.push_back(Elem) //list元素尾部增加一个元素x 

c.push_front(Elem) //list元素首元素钱添加一个元素X 

c.insert(pos,Elem) //在pos位置插入一个Elem拷贝,返回新数据的位置 

c.insert(pos,n,Elem) //在pos位置插入n个Elem数据,无返回值 

c.insert(pos,begin,end)
//在pos位置插入在[begin,end)区间的数据,无返回值 

### 删除数据###

c.pop_back() //删除容器尾元素,当且仅当容器不为空  

c.pop_front() //删除容器首元素,当且仅当容器不为空  

c.remove(Elem) //删除容器中所有元素值等于x的元素  

/** 
 remove_if()删除条件满足的元素(会遍历一次链表) 
*/  
void remove_if_test(){  
ShowList(g_list1);  
g_list1.remove_if(myFun);  
ShowList(g_list1);  
}  

c.clear() //删除容器中的所有元素  

c.erase(pos) //删除pos位置的数据,返回下一个数据的位置  

c.erase(begin,end) 
//删除[begin,end)区间的数据,返回下一个数据的位置  

c.unique() //删除相邻重复元素  
//示例  
L1( 1, 1 ,4,3,5,1)  
L1.unique( );     // L1(1,4,3,5,1)  

### 示例###

#include 
#include 
#include 
using namespace std; 
list  g_list1; 
list  g_list2; 
/** 
 初始化全局列表 
*/ 
void InitList(){ 
// push_back()增加一元素到链表尾 
g_list1.push_back( 1 ); 
g_list1.push_back( 2 ); 
g_list1.push_back( 3 ); 
// push_front()增加一元素到链表头 
g_list2.push_front( 6 ); 
g_list2.push_front( 5 ); 
g_list2.push_front( 4 ); 
} 
/** 
 输出一个链表 
*/ 
void ShowList(list & listTemp){ 
// size()返回链表中元素个数 
cout < ::iterator it = listTemp.begin();
it != listTemp.end(); ++ it){ 
  cout <<* it <<' ' ; 
} 
  cout < listTemp; 
cout < listTemp( 3 ); 
 ShowList(listTemp); 
} 
/** 
 构造函数,建一个含五个元素的链表,值都是1 
*/ 
void constructor_test2(){ 
 list  listTemp( 5 , 1 ); 
 ShowList(listTemp); 
} 
/** 
 构造函数,建一个g_list1的copy链表 
*/ 
void constructor_test3(){ 
 list  listTemp(g_list1); 
 ShowList(listTemp); 
} 
/** 
 构造函数,listTemp含g_list1一个区域的元素[_First, _Last) 
*/ 
void constructor_test4(){ 
 list  listTemp(g_list1.begin(), g_list1.end()); 
 ShowList(listTemp); 
} 
/** 
 assign()分配值,有两个重载 
 template  
 void assign ( InputIterator first, InputIterator last ); 
 void assign ( size_type n, const T& u ); 
*/ 
void assign_test(){ 
 list  listTemp( 5 , 1 ); 
 ShowList(listTemp); 
 listTemp.assign( 4 , 3 ); 
 ShowList(listTemp); 

 listTemp.assign( ++ g_list1.begin(), g_list1.end()); 
 ShowList(listTemp); 
} 
/** 
 operator= 
*/ 
void operator_equality_test(){ 
 g_list1 = g_list2; 
 ShowList(g_list1); 
 ShowList(g_list2); 
} 
/** 
 front()返回第一个元素的引用 
*/ 
void front_test7(){ 
 cout < ::iterator it1 = g_list1.begin(); 
 cout <<*++ it1 < ::const_iterator it2 = g_list1.begin(); 
 it2 ++ ; 
 // (*it2)++; // *it2 为const 不用修改 
 cout <<* it2 < ::iterator it = g_list1.end(); // 注意是:最后一个元素的下一位置的指针 
-- it; 
cout <<* it < ::reverse_iterator it = g_list1.rbegin(); 
 for (; it != g_list1.rend(); ++ it){ 
 cout <<* it <<' ' ; 
} 
 cout < ::reverse_iterator it = g_list1.rend(); 
-- it; 
cout <<* it < listTemp; 
if (listTemp.empty()) 
cout <<" listTemp为空 " < ::size_type nMax = g_list1.max_size(); 
cout < 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  ()); 
ShowList(listTemp); 
} 
/** 
 merge()合并两个升序序链表并使之成为另一个升序. 
*/ 
void merge_test1(){ 
list  listTemp2; 
listTemp2.push_back( 3 ); 
listTemp2.push_back( 4 ); 

list  listTemp3; 
listTemp3.push_back( 9 ); 
listTemp3.push_back( 10 ); 

ShowList(listTemp2); 
cout < int (second) ); } 
/** 
 merge()合并两个降序链表并使之成为另一个降序. 
*/ 
void merge_test2(){ 
list  listTemp2; 
listTemp2.push_back( 4 ); 
listTemp2.push_back( 3 ); 

list  listTemp3; 
listTemp3.push_back( 10 ); 
listTemp3.push_back( 9 ); 

ShowList(listTemp2); 
cout <()); // 第二个参数可以是自己定义的函数如下 
listTemp2.merge(listTemp3, myCmp); 
ShowList(listTemp2); 
} 
/** 
  splice()对两个链表进行结合(三个重载函数),结合后第二个链表清空 
  void splice ( iterator position, list& x ); 
  void splice ( iterator position,
  list& x, iterator i ); 
  void splice ( iterator position, 
  list& x, iterator first, iterator last ); 
*/ 
void splice_test(){ 
list  listTemp1(g_list1); 
list  listTemp2(g_list2); 

ShowList(listTemp1); 
ShowList(listTemp2); 
cout < 
  void insert ( iterator position, InputIterator first, InputIterator last ); 
*/ 
void insert_test(){ 
list  listTemp1(g_list1); 
ShowList(listTemp1); 
listTemp1.insert(listTemp1.begin(), 51 ); 
ShowList(listTemp1); 
cout < listTemp2(g_list1); 
ShowList(listTemp2); 
listTemp2.insert(listTemp2.begin(), 9 , 51 ); 
ShowList(listTemp2); 
cout < listTemp3(g_list1); 
ShowList(listTemp3); 
listTemp3.insert(listTemp3.begin(),g_list2.begin(), g_list2.end()); 
ShowList(listTemp3); 

} 
/** 
 swap()交换两个链表(两个重载) 
*/ 
void swap_test(){ 
ShowList(g_list1); 
ShowList(g_list2); 
cout < 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  listTemp2(listTemp); 

ShowList(listTemp); 
listTemp.unique(); // 不会删除不相邻的相同元素 
ShowList(listTemp); 
cout <

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了读书的目的以及学习算法的重要性,并介绍了两个算法:除法速算和约瑟夫环的数学算法。同时,通过具体的例子和推理,解释了为什么x=x+k序列中的第一个人的位置为k,以及序列2和序列3的关系。通过学习算法,可以提高思维能力和解决问题的能力。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
author-avatar
手机用户2502931713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有