C++ STL之list容器的基本操作
由于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容器的基本操作的更多相关文章
- C++ STL之vector容器的基本操作
注意事项:特别注意任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)特别注意begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最 ...
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- 带你深入理解STL之Vector容器
C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. ST ...
- STL中的容器介绍
STL中的容器主要包括序列容器.关联容器.无序关联容器等. 一]序列容器 (1) vector vector 是数组的一种类表示,提供自动管理内存的功能,除非其他类型容器有更好满足程序的要求,否则,我 ...
- STL序列式容器学习总结
STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...
- STL——关联式容器
一.关联式容器 标准的STL关联式容器分为set(集合)/map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和 multimap(多键映射表).这些容器的底层机制均以RB-tre ...
- STL——序列式容器
一.容器概述与分类 1. STL容器即是将运用最广的一些数据结构实现出来.常用的数据结构有array, list, tree, stack, queue, hash table, set, map…… ...
- C++标准模板库(STL)和容器
1.什么是标准模板库(STL)? (1)C++标准模板库与C++标准库的关系 C++标准模板库其实属于C++标准库的一部分,C++标准模板库主要是定义了标准模板的定义与声明,而这些模板主要都是 类模板 ...
- [C++]STL中的容器
C++11 STL中的容器 一.顺序容器: vector:可变大小数组: deque:双端队列: list:双向链表: forward_list:单向链表: array:固定大小数组: string: ...
随机推荐
- 部署图 Deployment Diagram
UML部署图描述了一个运行时的硬件结点,以及在这些结点上运行的软件组件的静态视图. 部署图显示了系统的硬件,安装在硬件上的软件,以及用于连接异构的机器之间的中间件. 下面这张图介绍了部署图的基本内容: ...
- Error: Cannot find module 'express'
安装Express命令如下: npm install -g express 安装成功之后会在C:\Users\[YOUR_USER_NAME]\AppData\Roaming\npm\node_mod ...
- VBS基础篇 - 循环
经常地,当编写代码时,我们希望将一段代码执行若干次,我们可以在代码中使用循环语句来完成这项工作. 循环可分为三类:一类在条件变为 False 之前重复执行语句,一类在条件变为 True 之前重复执行语 ...
- Hadoop启动异常情况解决方案
1. 启动时报WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using b ...
- MST性质(用于构造最小生成树)
描述:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集.若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树. 证明: 假设网N的 ...
- firefox同步ajax请求报错的问题 A parameter or an operation is not supported by the underlying object
今天在测试系统时,一个很正常的功能在firefox下报错,经过验证在ie和chrome浏览器中功能这个正常. 调试后发现: 请求比其他请求的特殊点在于同步请求. 经过firefox的控制台上测 ...
- 移动端页面使用rem来做适配
文/九彩拼盘(简书作者)原文链接:http://www.jianshu.com/p/eb05c775d3c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. rem介绍 rem(font ...
- 2-Highcharts曲线图之折线图
示例图片,在网上下载一张图片如图:其中数据自定义 引入上节模版配置 在script标签中写代码:具体代码如下 信息将在代码中解释. 分析:“五省收益趋势”是标题: x坐标为[2011年-2016 ...
- Codeforces Round #256 (Div. 2) Multiplication Table
C题, #include<cstdio> #include<cstring> #include<algorithm> #define maxn 5005 using ...
- 提高jQuery执行效率需要注意几点
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...