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: ...
随机推荐
- 暂停更新Blog
今天非常不好意思的是老魏又要一次的暂停文章跟新了,原因是有些有问题老魏需要从新的梳理,加上这几天工作又开始忙碌起来了,所以这一阵子估计很难有有时间更新了. 不过老魏会抽一下时间更新文章的,不可能像2月 ...
- UML 小结(5)- 图解 Rational Rose 的详细安装过程
在学习UML的时候,会用到画图工具:Rotional Rose . 原以为这款软件直接下载下来或者跟朋友那边拷过来就可以直接用了,结果却是没有那么简单,如果读者您也是为了解决这个家伙的安装问题的话,那 ...
- oracle中事务处理
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败. 事务和锁 当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户改表的结构 ...
- 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)
目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...
- WPF简单布局 浅尝辄止
WPF的窗口只能包含一个元素,为了在WPF窗口中放置多个元素并创建更实用的用户界面,需要在窗口上放置一个容器,然后在容器中放置其它元素. 注意:造成这一限制的原因是window类继承自 ...
- 【Leetcode】 - Single Number II
Problem Discription: Suppose the array A has n items in which all of the numbers apear 3 times excep ...
- Highcharts-3.0.6
Highcharts-3.0.6 报表插件
- [转]谈谈C++中的swap函数
1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T c(a) ...
- [转]GLES 3.0 新特性
转自: http://www.ifanr.com/131333 OpenGL ES 3.0 带来很多新特性,根据 AnandTech 的解释: 支持更多缓冲区对象.在 OpenGL ES 2.0 时中 ...
- fedora下缺少autopoint包的解决办法
编译过程中,报错,缺少autopoint包 然而无论是yum install autopoint 还是yum search autopoint都没有理想的答案 执行yum install gettex ...