由于list和vector同属于序列式容器,有很多相同的地方,而上一篇中已经写了vector,所以这一篇着重写list和vector的不同之处和特有之处。

特别注意的地方:

(1)STL中迭代器容器中都要注意的地方(vector中已经提到):
1)任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)
2)begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最后一个元素)
3)迭代器的时效性,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果

(2)list的迭代器是双向迭代器(只能++   --,没有偏移功能)而不是像vector那样的随机迭代器(和指针几乎一样的所有功能)

(3)list和vector的区别,本质区别:list是链式存储,vector在内存中是连续区别的,有本质区别而导致下面区别

1)list不支持随机访问(2)中已经说明,vector可以像数组那样使用平[]访问元素,而list是不可以的

2) list的插入和删除效率很高,所以list有push_front、pop_front、sort而vector中这些操作的效率太低了,所以STL中没有写这些功能

3)list的一些特有的函数remove、reverse、unique、splice、merge功能(这些连deque中都没有的)

下面就是区别于vector的功能的list操作

 #include<iostream>
#include<list>
using namespace std;
void print(list<int> link)
{
list<int> ::iterator it;
for(it=link.begin();it!=link.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
//链表的初始化是使用指针的,所以使用的是数组的地址
//特别注意:vector中已经注意到两个迭代器形成的区间是前闭后开的
int num[]={,,,,,,,,,};
list<int> link(&num[],&num[]+);
print(link); //特别注意list的迭代器是双向迭代器,而不是vector那样的随机迭代器,双向迭代器没有偏移能力,只能++ --,不能+5
/*例如,下面这两句就只能在随机迭代器中用,而不能再双向迭代器中用
list<int> ::iterator it=link.begin();
it=it+3;*/ //push操作,vector是在内存中是顺序存储的,如果往头部添加或者删除元素效率会非常的低,所以vector中并没有push_front,pop_front操作,
//但链表是链式存储的不用担心这个问题
link.push_front();
print(link); //链表的删除操作除了erase之外,还有一个romove。
//remove与erase不同,erase是删除指定位置的节点,而remove是删除指定值的节点
cout<<"删除第一个元素:"<<endl;
link.erase(link.begin());
print(link);
cout<<"删除值为6的所有元素"<<endl;
link.remove();
print(link); //排序,list中的排序有直接的函数而不需要使用algorithm里面的函数
cout<<"原来的数据:"<<endl;
print(link);
cout<<"sort之后的数据:"<<endl;
link.sort();
print(link); //反转reverse
cout<<"原来的数据:"<<endl;
print(link);
cout<<"reverse之后的数据:"<<endl;
link.reverse();
print(link); //unique功能去除链表中相邻的重复元素
int a[]={,,,,,,,,,};
list<int>a_unique(&a[],&a[]+);
cout<<"原来的数据:"<<endl;
print(a_unique);
a_unique.unique();
cout<<"unique之后的数据:"<<endl;
print(a_unique); //在指定list的迭代器位置上拼接另一个链表中另一个迭代器或者另一个迭代器指定的区间的数据
//splice
int a1[]={,,};
int a2[]={,,};
list<int>link1(&a1[],&a1[]+);
list<int>link2(&a2[],&a2[]+);
cout<<"原来的数据:"<<endl;
cout<<"link1:"<<endl;
print(link1);
cout<<"link2:"<<endl;
print(link2);
link1.splice(link1.begin(),link2,link2.begin());
cout<<"拼接后的数据:"<<endl;
cout<<"link1:"<<endl;
print(link1);
cout<<"link2:"<<endl;
print(link2); cout<<"原来的数据:"<<endl;
cout<<"link1:"<<endl;
print(link1);
cout<<"link2:"<<endl;
print(link2);
link1.splice(link1.end(),link2,link2.begin(),link2.end());
cout<<"拼接后的数据:"<<endl;
cout<<"link1:"<<endl;
print(link1);
cout<<"link2:"<<endl;
print(link2); //融合两个排序的list,融合的list依然是排序的
int b1[]={,,};
int b2[]={,,};
list<int>l1(&b1[],&b1[]+);
list<int>l2(&b2[],&b2[]+);
cout<<"原来的数据:"<<endl;
cout<<"l1:"<<endl;
print(l1);
cout<<"l2:"<<endl;
print(l2);
l1.merge(l2);
cout<<"融合后的数据"<<endl;
cout<<"l1:"<<endl;
print(l1);
cout<<"l2:"<<endl;
print(l2); //如果需要使用merge融合两个list,事先需要对两个list排序
//有些书中说融合两个未排序的list,融合的list也是未排序的
//很遗憾,在vs2010中这样运行会出错的,如下面这段代码,虽然编译通过,但是运行会出错
/*int c1[3]={1,4,4};
int c2[3]={6,3,5};
list<int>lc1(&c1[0],&c1[2]+1);
list<int>lc2(&c2[0],&c2[2]+1);
cout<<"原来的数据:"<<endl;
cout<<"lc1:"<<endl;
print(lc1);
cout<<"lc2:"<<endl;
print(lc2);
lc1.merge(lc2);
cout<<"融合后的数据"<<endl;
cout<<"lc1:"<<endl;
print(lc1);
cout<<"lc2:"<<endl;
print(lc2);*/
return ;
}

由于运行结果在一张截屏没法截下来了,所以就不贴结果了

C++ STL之list容器的基本操作的更多相关文章

  1. C++ STL之vector容器的基本操作

    注意事项:特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最 ...

  2. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  3. 带你深入理解STL之Vector容器

    C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. ST ...

  4. STL中的容器介绍

    STL中的容器主要包括序列容器.关联容器.无序关联容器等. 一]序列容器 (1) vector vector 是数组的一种类表示,提供自动管理内存的功能,除非其他类型容器有更好满足程序的要求,否则,我 ...

  5. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  6. STL——关联式容器

    一.关联式容器 标准的STL关联式容器分为set(集合)/map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和 multimap(多键映射表).这些容器的底层机制均以RB-tre ...

  7. STL——序列式容器

    一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...

  8. C++标准模板库(STL)和容器

    1.什么是标准模板库(STL)? (1)C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板 ...

  9. [C++]STL中的容器

    C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...

随机推荐

  1. Pomodairo,番茄工作法-解刨篇

    处于“信息大爆炸”的 e 时代的我们每天必定要处理很多的事情,不管是工作.学习.生活......面对这么多的纷杂的事物我们将如何应对?如何做到有条不紊的进行?高效.轻松.愉快的完成它呢?这时一款精致的 ...

  2. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  3. div均匀分布代码实例

    多个div在同一行以相同间隔分布: 这样的布局效果使用非常的频繁,也就是让多个div在一行分布,并且div于div之间的间隙是一样的,多用在对于产品的展示之用,下面就介绍一下如何实现此中布局,代码实例 ...

  4. OI 回忆录

    时间过得好快,一下子就高三了,一下子就退役了,两年的时间仿佛就在一眨眼的功夫内度过了.不过还是想回忆回忆这两年的雨雪风霜,也就当做个总结吧. 高一其实并没有什么好说的,反正就这么颓到了高二. 高二上学 ...

  5. Open Phone, SMS, Email, Skype and Browser apps of Android in Unity3d

    最近项目需要使用Android的一些基本功能,写插件各种悲剧,google了一下,如获至宝.Nice ! string url = String.Format("tel:{0}", ...

  6. hdu 3790 最短路径问题(最短路,Dijsktra)

    题目 Dijsktra基础题,只是多了一个花费,稍稍变动处理就好 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include&l ...

  7. HDU 2136 Largest prime factor(查找素数,筛选法)

    题目梗概:求1000000以内任意数的最大质因数是第几个素数,其中 定义 1为第0个,2为第1个,以此类推. #include<string.h> #include<stdio.h& ...

  8. Grunt打包GMU组件 报错处理

    莫Q群的大神推荐移动GMU组件,GMU是基于zepto的mobile UI组件库,提供webapp.pad端简单易用的UI组件,官网:http://gmu.baidu.com/具有以下特点: 简单易用 ...

  9. [转]SQL Server建立应用程序安全性和程序角色

    转自:http://dev.yesky.com/450/7619450.shtml 2007-10-22 14:00 来源:论坛整理 作者:luolina 责任编辑:幽灵·yesky Microsof ...

  10. 【转载】Dom篇

    一. 初探Dom     1. Dom介绍 二. Dom基础     1. window顶级对象     2. body.document对象事件     3. 通用的HTML元素的事件     4. ...