不同于採用线性表顺序存储结构的vector和deque容器。list双向链表中任一位置的元素差值、插入和删除,都具有高效的常数阶算法时间复杂度O(1)。

头文件

#include<list>

创建list对象

1)list();//创建一个没有不论什么元素的list对象。

list<int>l 

2)list(size_type n);//创建一个具有n个元素的list对象,每一个元素採用它的类型下的默认值。

list<int>l(10);//list对象l有10个元素。每一个元素初始值为。

3)list<size_type n, constT& value); //创建一个具有n个元素的list对象,这些元素的初始值为value。

list<double>l(10,5.6); 

4)list(const list&);//list的拷贝构造函数,通过拷贝一个list对象的元素值,创建一个新的list对象。

list<char>l1(5,’a’);
list<char>l2(l1);

5)list(const InputIterator first, const InputIterator last,const A& a=A());

//将迭代区间[first,last)所指的元素复制到一个新创建的list对象中。当中内存分配器可缺省。

//利用int数组iArray,创建一个list对象l
intiArray[]={1,2,3,4,5,6,7};
list<int>l(iArray, iArray+7); // 创建list对象

初始化赋值

利用list提供的push_back函数,可将元素依次链入链表中。push_back函数经常使用于list容器的初始化。

元素的遍历訪问

因为链表中元素须要一个个元素遍历,因此,list元素的遍历仅仅能使用迭代器的方式进行。

#include <iostream>
#include <list>
using namespace std;
int main ()
{
int Array[] = {16,2,77,29};
//用上面第五种方式创建list对象
list<int> mylist(Array,Array+sizeof(Array)/sizeof(int));
//遍历输出
for (list<int>::iterator it = mylist.begin(); it != mylist.end(); it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}

list链表元素的插入

因为list链表元素的插入不须要对其它元素进行移位拷贝。因此list元素的插入函数是有常数阶的O(1)算法时间复杂度。

voidpush_front(constT&);//头部插入

iteratorinsert(iterator pos, const T& x);//pos位置之前,插入新元素x

详细实例与前篇deque的应用相似。这里不再多说。

list链表元素的删除

list相同具有高效的链表元素删除处理。包含删除首元素pop_front函数、删除尾元素的pop_back函数,删除任何位置或迭代区间上元素的erase函数。以及删除全部元素的clear函数。

1)void pop_front();//删除 list的第一个链表元素

2)void pop_back();//删除 list的最后一个链表元素

3)iteratorerase(iterator pos);//删除 pos所指向的链表元素

4)iteratorerase(iterator first, iterator last);//删除迭代器区间 [first, last)所指向的全部链表元素

5)void clear();//删除全部 list链表元素

6)void remove(constT& value);//删除 list链表中全部元素值为 value的元素

详细实例与前篇deque的应用相似,这里不再多说。

list链表的归并

list 链表元素的排序。是将 list链表切割成若干部分进行子排序,然后通过归并处理,实现 list的全部元素的排序。为此,list容器提供了
splice和 merge归并函数。

1)void splice(iterator position, list& x);//将 x的链表归并到当前 list链表的
position位置之前。 list对象 x将被清空

void splice(iterator position, list& x, iterator i);//将一个 list的迭代器
i 值所指的元素。归并到当前 list列表中。并将被归并的元素从原链表中删除。

void merge(list& x);//将list对象 x的链表归并到当前
list链表中,并清空 x的链表。

从merge 函数的源代码可看出。仅仅有当前 list链表和被归并的
x链表的元素,均预先依照元素值的 "<"关系排好,merge函数才具有意义,归并后的链表元素也是按 "<"关系排序的。

#include <list>
#include <iostream>
using namespace std; void print(list<int>& l);
int main()
{
list<int> l;
list<int> carry;
for (int j=1; j<=10; j++)
{
l.push_back(j);
}
// splice() 函数
carry.splice(carry.begin(), l, ++l.begin());
// 打印carry
cout << "carry 的链表元素为: ";
print(carry);
// 打印l
cout << "l 的链表的元素为:";
print(l);
// merge() 函数使用方法
list<int> x;
x.push_back(30);
x.push_back(31);
x.push_back(32);
l.merge(x);
// 打印x
cout << "x 的链表元素为空";
print(x);
// 打印l
cout << "l 的链表元素为:";
print(l);
return 0;
}
// list 链表打印
void print(list<int>& l)
{
list<int>::iterator i, iend;
iend = l.end();
for (i=l.begin(); i!=iend; ++i)
cout << *i << ' ';
cout << endl << endl;
}

list的元素排序

list 提供的 void sort函数。按 "<"关系进行 list链表元素排序,较小的元素排在前面。

#include <list>
#include <iostream>
using namespace std;
void print(list<int>& l); int main()
{
list<int> l;
for(int j=18; j>=0; j--)
l.push_back(j);
cout << "排序前: " ; print(l);
//调用list<int>::sort()函数排序
l.sort();
cout << "排序后: " ; print(l);
return 0;
}
void print(list<int>& l)
{
list<int>::iterator i,iend;
iend=l.end();
for(i=l.begin(); i!=iend; i++)
cout << *i << ' ';
cout << endl;
}

list的连续反复元素的剔除

利用 list 提供的 void unique函数,可将连续反复的元素删除。仅保留一个。

#include <list>
#include <iostream>
using namespace std;
int main(void)
{
list<int> l;
l.push_back(6);
l.push_back(8);
l.push_back(6);
l.push_back(6);
l.push_back(6);
l.push_back(9);
l.push_back(13);
l.push_back(6);
l.unique();
list<int>::iterator i,iend;
iend=l.end();
for(i=l.begin(); i!=iend; i++)
cout << *i << ' ';
cout << endl;
return 0;
}





此文为本人原创,转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46742541

stl之list双向链表容器应用基础的更多相关文章

  1. stl之set集合容器应用基础

    set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据.每一个节点包括一个取值红色或黑色的颜色域.以利于进行树的平衡处理.作为节点键值的元素 ...

  2. C++ STL中的常用容器浅谈

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...

  3. stl中顺序性容器,关联容器两者粗略解释

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  4. 深入解析C++ STL中的常用容器

    转载:http://blog.csdn.net/u013443618/article/details/49964299 这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的 ...

  5. list双向链表容器(常用的方法总结)

    特别注意,由于list对象的结点并不要求在一段连续的内存中,所以,对于迭代器,只能通过++或者--的操作将迭代器移动到后继或者前驱结点元素处.而不能对迭代器进行+n或者-n的操作,这点与vector等 ...

  6. C++标准模板库STL算法与自适应容器(栈和队列)

    参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...

  7. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  8. 【转】 STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  9. STL中的set容器的一点总结(转)

    STL中的set容器的一点总结 1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂 ...

随机推荐

  1. Linux makefile 教程 非常详细,且易懂【转】

    转自:   http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程,买了一本叫<Linux环境下的C ...

  2. IC卡的传输协议(2)-块传输协议T=1续【转】

    转自:http://bbs.ednchina.com/BLOG_ARTICLE_172025.HTM (3)容错操作 先来看一下容错的规则定义. * 复位应答后,第一个数据块是由终端发往IC卡的,而且 ...

  3. 冒泡排序的思想 python 冒泡排序、递归排序

    冒泡排序的时间复杂度是O(N^2) 冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置 比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, 对相邻的两位 ...

  4. 【uva11421】玩纸牌

    数学期望. #include<bits/stdc++.h> ; using namespace std; double d[N][N],p; int main(){ ;double p;s ...

  5. 利用php设置url转发 - 解决空间不提供子目录绑定功能的问题

    由于很多新手都是使用的虚拟空间都是最便宜的那种,这空间一般不支持子目录绑定.但是很多朋友又想设置几个不同的二级域名访问不同的网站程序.于是大家找到了域名url转发,但是由于国家政策的原因,许多服务商暂 ...

  6. 用IJ和gradle启动elasticsearch5.4.3

    环境准备 jdk gradle3.3+ idea git 从git clone源码 git checkout v5.4.3 打开项目 1. 在edit configurations添加new conf ...

  7. django学习随笔:ManagementUtility

    ManagementUtility类,位于django.core.management目录下的__init__.py文件. 这个类,在其init中: def __init__(self, argv=N ...

  8. Centos 下,配置 Apache + Python + Django + postgresSQL 开发环境

    用 Python 搭建一个 Web 服务器 文章结构 一.安装  Apache.Python.django 二.安装 mod_wsgi,Apache 为 Python 提供的 wsgi 模块  三.将 ...

  9. MATLAB的cftool工具箱简介

    下面,通过一个例子说明cftool可视化界面工具箱的用法. 例如,已知 x = [0 0.2 0.50.8 0.9 1.3 1.4 1.9 2.1 2.2 2.5 2.6 2.9 3.0]; y = ...

  10. HDU 1856 More is better (并查集)

    题意: 给你两个数代表这两个人是朋友,朋友的朋友还是朋友~~,问这些人组成的集合里面人最多的是多少... 思路: 属于并查集了,我用的是带路径压缩的,一个集合里面所有元素(除了根节点)的父节点都是根节 ...