当前位置:  编程技术>c/c++/嵌入式

关于STL中list容器的一些总结

    来源: 互联网  发布时间:2014-10-20

    本文导语:  1.关于list容器 list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置...

1.关于list容器

list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。list的实现大概是这样的:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。其实,list和循环链表也有相似的地方,即:头节点的前驱元素指针域保存的是链表中尾元素的首地址,list的尾节点的后继元素指针域则保存了头节点的首地址,这样,list实际上就构成了一个双向循环链。由于list元素节点并不要求在一段连续的内存中,显然在list中是不支持快速随机存取的,因此对于迭代器,只能通过“++”或“--”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作,这点,是与vector等不同的地方。

我想把三个常用的序列式放在一起对比一下是有必要的:

vector :vector和built-in数组类似,拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的。

list:list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

deque:deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。

因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,具体可以遵循下面的原则:
1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

2.list中常用的函数

2.1 list中的构造函数:

list() 声明一个空列表;

list(n) 声明一个有n个元素的列表,每个元素都是由其默认构造函数T()构造出来的

list(n,val) 声明一个由n个元素的列表,每个元素都是由其复制构造函数T(val)得来的

list(n,val) 声明一个和上面一样的列表

list(first,last) 声明一个列表,其元素的初始值来源于由区间所指定的序列中的元素

--------------------------------------------------------------------------------

2.2 begin()和end():通过调用list容器的成员函数begin()得到一个指向容器起始位置的iterator,可以调用list容器的 end() 函数来得到list末端下一位置,相当于:int a[n]中的第n+1个位置a[n],实际上是不存在的,不能访问,经常作为循环结束判断结束条件使用。

--------------------------------------------------------------------------------

2.3 push_back() 和push_front():使用list的成员函数push_back和push_front插入一个元素到list中。其中push_back()从list的末端插入,而 push_front()实现的从list的头部插入。

--------------------------------------------------------------------------------

2.4 empty():利用empty() 判断list是否为空。

--------------------------------------------------------------------------------

2.5 resize(): 如果调用resize(n)将list的长度改为只容纳n个元素,超出的元素将被删除,如果需要扩展那么调用默认构造函数T()将元素加到list末端。如果调用resize(n,val),则扩展元素要调用构造函数T(val)函数进行元素构造,其余部分相同。

--------------------------------------------------------------------------------

2.6 clear(): 清空list中的所有元素。

--------------------------------------------------------------------------------

2.7 front()和back(): 通过front()可以获得list容器中的头部元素,通过back()可以获得list容器的最后一个元素。但是有一点要注意,就是list中元素是空的时候,这时候调用front()和back()会发生什么呢?实际上会发生不能正常读取数据的情况,但是这并不报错,那我们编程序时就要注意了,个人觉得在使用之前最好先调用empty()函数判断list是否为空。

--------------------------------------------------------------------------------

2.8 pop_back和pop_front():通过删除最后一个元素,通过pop_front()删除第一个元素;序列必须不为空,如果当list为空的时候调用pop_back()和pop_front()会使程序崩掉。

--------------------------------------------------------------------------------

2.9 assign():具体和vector中的操作类似,也是有两种情况,第一种是:l1.assign(n,val)将 l1中元素变为n个T(val)。第二种情况是:l1.assign(l2.begin(),l2.end())将l2中的从l2.begin()到l2.end()之间的数值赋值给l1。

--------------------------------------------------------------------------------

2.10 swap():交换两个链表(两个重载),一个是l1.swap(l2); 另外一个是swap(l1,l2),都可能完成连个链表的交换。

--------------------------------------------------------------------------------

2.11 reverse():通过reverse()完成list的逆置。

--------------------------------------------------------------------------------

2.12 merge():合并两个链表并使之默认升序(也可改),l1.merge(l2,greater()); 调用结束后l2变为空,l1中元素包含原来l1 和 l2中的元素,并且排好序,升序。其实默认是升序,greater()可以省略,另外greater()是可以变的,也可以不按升序排列。

看一下下面的程序:

代码如下:

#include
#include

using namespace std;

int main()
{
    list l1;
    list l2(2,0);
    list::iterator iter;
    l1.push_back(1);
    l1.push_back(2);
    l2.push_back(3);
    l1.merge(l2,greater());//合并后升序排列,实际上默认就是升序
    for(iter = l1.begin() ; iter != l1.end() ; iter++)
    {
        cout


    
 
 

您可能感兴趣的文章:

  • c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  • 请问STL中的所有容器(map,multimap,list,queue,vector,set,multiset.......)在BOOST中都可以找到么
  • c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
  • STL各个容器性能详细比较
  • c++ stl栈容器stack的pop(),push()等用法介绍及头文件
  • 过河小兵,求救各位大哥,我想把stl中的map,vector等容器,做成内存共享方式,希望大哥大姐们指点一下
  • c++ STL关联式容器Map成员函数介绍及查找(find()),插入(insert()),删除(erase())等操作代码举例
  • 浅析stl序列容器(map和set)的仿函数排序
  • 双向队列Deque 类成员函数列表参考(c++ STL 容器)
  • 浙ICP备11055608号-3 iis7站长之家
  • STL常用容器详细解析
  • 深入解析C++ STL中的常用容器
  • c++ STL容器总结之:vertor与list的应用
  • 关于STL中的map容器的一些总结
  • 关于STL中set容器的一些总结
  • 关于STL中vector容器的一些总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c++ STL List查找遍历及各成员函数用法详细介绍
  • STL list 指针元素的问题
  • STL list链表的用法详细解析
  • C++ STL Bitsets构造函数及成员函数解释及代码示例
  • SGI的STL库 SGI STL
  • STL vector+sort排序和multiset/multimap排序比较
  • 在UNIX中可以包含STL算法吗?
  • C++ STL标准模板库类String成员详细列表参考及示例代码
  • linux完全支持C++STL嗎?
  • C++ stl队列Queue用法介绍:删除,插入等操作代码举例
  • 是不是只有C++才可以使用STL?
  • C++ STL库中priority_queue介绍,成员函数说明及priority_queue具体用法举例
  • STL 在 UNIX 多线程 中不能用?
  • c++ stl multimap基本操作使用技巧详细介绍
  • Linux系统下如何获取STL帮助
  • C++ STL MultiSet类成员函数介绍及具体用法示例
  • STL实现 EASTL
  • 在COMPAQ TRUE64 UNIX用C++编程,使用Gcc,支不支持stl?
  • 哪儿能下载aix4.3的c++ stl库
  • 请问在linux下面编程怎样查询stl类的成员函数
  • 关于stl源代码
  • 请问如果要同时使用STL和多线程,会很麻烦么
  • linux下用c语言写的程序,其中可以使用STL模板吗?先谢谢各位
  • 如果是系统里同时存在两个不同的STL库的话会怎样?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3