由于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. 什么是ajax,ajax原理是什么 ,优缺点是什么

    AJAX工作原理及其优缺点   1.什么是AJAX?AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页 ...

  2. JPA学习---第一节:JPA详解

    一.详解 JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是 ...

  3. VBS基础篇 - 变量

    VBScript只有一种数据类型 —— Variant,它是根据上下文来判断是数字还是字符串.因为Variant是VBScript中唯一的数据类型,所以它也是VBScript中所有函数的返回值的数据类 ...

  4. Careercup - Facebook面试题 - 5110993575215104

    2014-04-30 16:12 题目链接 原题: The beauty of a number X is the number of 1s in the binary representation ...

  5. 【转】jquery-取消冒泡

    转自:http://blog.163.com/css_mm/blog/static/209182176201262665157634/ 1.通过返回false来取消默认的行为并阻止事件起泡. jQue ...

  6. java文件操作(输出目录、查看磁盘符)

    问题描述:     java操作文件,所有硬盘中所有文件路径 问题解决:     (1)查看所有磁盘文件 注:     如上所示,使用接口 File.listRoots()可以返回所有磁盘文件,通过f ...

  7. C# 知识笔记

    HttpContext.Request.Form.ToString() 获取Form表单中的内容 /// <summary> /// 获取 GET 提交方式值 /// </summa ...

  8. **bootstrap常见常用样式总结

    1.水平居中 用 .text-center 类

  9. 表单验证插件——validate

    表单验证插件——validate 该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下: $(form).validate({options ...

  10. fhq_treap 总结

    今天跟着zcg大神学了一发fhq_treap 发现在维护区间问题上fhq_treap不仅思维量小,而且代码量更小 是Splay的不错的替代品,不过至今还是有一些问题不能很好的解决 譬如查询某个数在序列 ...