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)中已经说明

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

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

  1 #include<iostream>
  2 #include<list>
  3 using namespace std;
  4 void print(list<int> link)
  5 {
  6     list<int> ::iterator it;
  7     for(it=link.begin();it!=link.end();it++)
  8     {
  9         cout<<*it<<" ";
 10     }
 11     cout<<endl;
 12 }
 13 int main()
 14 {
 15     //链表的初始化是使用指针的,所以使用的是数组的地址
 16     //特别注意:vector中已经注意到两个迭代器形成的区间是前闭后开的
 17     int num[10]={0,1,2,3,4,5,6,7,8,9};
 18     list<int> link(&num[0],&num[9]+1);
 19     print(link);
 20
 21     //特别注意list的迭代器是双向迭代器,而不是vector那样的随机迭代器,双向迭代器没有偏移能力,只能++ --,不能+5
 22     /*例如,下面这两句就只能在随机迭代器中用,而不能再双向迭代器中用
 23     list<int> ::iterator it=link.begin();
 24     it=it+3;*/
 25
 26     //push操作,vector是在内存中是顺序存储的,如果往头部添加或者删除元素效率会非常的低,所以vector中并没有push_front,pop_front操作,
 27     //但链表是链式存储的不用担心这个问题
 28     link.push_front(5);
 29     print(link);
 30
 31     //链表的删除操作除了erase之外,还有一个romove。
 32     //remove与erase不同,erase是删除指定位置的节点,而remove是删除指定值的节点
 33     cout<<"删除第一个元素:"<<endl;
 34     link.erase(link.begin());
 35     print(link);
 36     cout<<"删除值为6的所有元素"<<endl;
 37     link.remove(6);
 38     print(link);
 39
 40     //排序,list中的排序有直接的函数而不需要使用algorithm里面的函数
 41     cout<<"原来的数据:"<<endl;
 42     print(link);
 43     cout<<"sort之后的数据:"<<endl;
 44     link.sort();
 45     print(link);
 46
 47     //反转reverse
 48     cout<<"原来的数据:"<<endl;
 49     print(link);
 50     cout<<"reverse之后的数据:"<<endl;
 51     link.reverse();
 52     print(link);
 53
 54     //unique功能去除链表中相邻的重复元素
 55     int a[10]={1,1,3,2,2,2,1,1,2,3};
 56     list<int>a_unique(&a[0],&a[9]+1);
 57     cout<<"原来的数据:"<<endl;
 58     print(a_unique);
 59     a_unique.unique();
 60     cout<<"unique之后的数据:"<<endl;
 61     print(a_unique);
 62
 63     //在指定list的迭代器位置上拼接另一个链表中另一个迭代器或者另一个迭代器指定的区间的数据
 64     //splice
 65     int a1[3]={1,3,5};
 66     int a2[3]={2,4,6};
 67     list<int>link1(&a1[0],&a1[2]+1);
 68     list<int>link2(&a2[0],&a2[2]+1);
 69     cout<<"原来的数据:"<<endl;
 70     cout<<"link1:"<<endl;
 71     print(link1);
 72     cout<<"link2:"<<endl;
 73     print(link2);
 74     link1.splice(link1.begin(),link2,link2.begin());
 75     cout<<"拼接后的数据:"<<endl;
 76     cout<<"link1:"<<endl;
 77     print(link1);
 78     cout<<"link2:"<<endl;
 79     print(link2);
 80
 81     cout<<"原来的数据:"<<endl;
 82     cout<<"link1:"<<endl;
 83     print(link1);
 84     cout<<"link2:"<<endl;
 85     print(link2);
 86     link1.splice(link1.end(),link2,link2.begin(),link2.end());
 87     cout<<"拼接后的数据:"<<endl;
 88     cout<<"link1:"<<endl;
 89     print(link1);
 90     cout<<"link2:"<<endl;
 91     print(link2);
 92
 93     //融合两个排序的list,融合的list依然是排序的
 94     int b1[3]={2,4,6};
 95     int b2[3]={1,3,5};
 96     list<int>l1(&b1[0],&b1[2]+1);
 97     list<int>l2(&b2[0],&b2[2]+1);
 98     cout<<"原来的数据:"<<endl;
 99     cout<<"l1:"<<endl;
100     print(l1);
101     cout<<"l2:"<<endl;
102     print(l2);
103     l1.merge(l2);
104     cout<<"融合后的数据"<<endl;
105     cout<<"l1:"<<endl;
106     print(l1);
107     cout<<"l2:"<<endl;
108     print(l2);
109
110
111     //如果需要使用merge融合两个list,事先需要对两个list排序
112     //有些书中说融合两个未排序的list,融合的list也是未排序的
113     //很遗憾,在vs2010中这样运行会出错的,如下面这段代码,虽然编译通过,但是运行会出错
114     /*int c1[3]={1,4,4};
115     int c2[3]={6,3,5};
116     list<int>lc1(&c1[0],&c1[2]+1);
117     list<int>lc2(&c2[0],&c2[2]+1);
118     cout<<"原来的数据:"<<endl;
119     cout<<"lc1:"<<endl;
120     print(lc1);
121     cout<<"lc2:"<<endl;
122     print(lc2);
123     lc1.merge(lc2);
124     cout<<"融合后的数据"<<endl;
125     cout<<"lc1:"<<endl;
126     print(lc1);
127     cout<<"lc2:"<<endl;
128     print(lc2);*/
129     return 0;
130 }

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

时间: 2024-11-11 19:59:14

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

C++ STL之容器的基本操作

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

C++STL之关联容器【map】【set】

map以键-值対的形式组织,键的作用在于索引,而值表示所存储和读取数据. set仅包含一个键,并且有效的支持某个键是否存在的查询. 他们都是基于标准型类库pair实现,该类型在utility头文件中. 一:关于pair类型的操作 pair<T1,T2> p1; //创建一个空pair类型 pair<T1,T2> p1(v1,v2); //创建并初始化 make_pair(v1,v2) //生成pair对象 <,>,==,!=  //类型之间比较,遵循字典序,先比较fir

初探STL之关联容器

关联容器 分类:set, multiset, map, multimap 特点:内部元素有序排列,新元素插入的位置取决于它的值,查找速度快. 常用函数: find: 查找等于某个值 的元素(x小于y和y小于x同时不成立即为相等) lower_bound : 查找某个下界 upper_bound : 查找某个上界 equal_range : 同时查找上界和下界 count :计算等于某个值的元素个数(x小于y和y小于x同时不成立即为相等) insert: 用以插入一个元素或一个区间 set 特点:

【C++之STL】理解容器(ing)

“容器可容纳一些数据的模板类” “容器是包容其他对象的对象” 两种类型:顺序容器.关联容器   顺序容器 关联容器 访问成员 顺序访问和随机访问 经过优化关键键值访问                   任何改变vector长度的操作都会是已存在的迭代器失效,如erase()删除元素 [C++之STL]理解容器(ing),布布扣,bubuko.com

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名

STL之关联容器的映射底层

STL的关联容器有set, map, multiset, multimap.用于实现它们的底层容器有划入标准的rb_tree和待加入标准的hashtable. 底层容器rb_tree为上层容器提供了一种有序的服务.关键步骤时间复杂度为O(lgN); 底层容器hashtable为上层容器提供的是无序的服务,但其关键步骤的时间复杂度为O(1). 那么上层容器是怎么映射到底层容器中去的呢?下面以set和map为例,说明它们是如何映射到rb_tree和hashtable的. 1 rb_tree模板头 对

STL中的容器

STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.slist是一个单向链表,rope本质上是一个重型字符串 非标准关联容器hash_set.hash_multiset.hash_map和hash_multimap. 几种标准非STL容器,包括数组.bitset.valarray.stack.queue和priority_queue 值得

STL之list容器的实现框架

说明:本文仅供学习交流,转载请标明出处,欢迎转载! list的底层采用数据结构是环形的双向链表, 相对于vector容器,list容器插入和删除操作付出的代价要比vector容器小得多,但是list带有链表的天生弱点,就是不支持随机访问.从内置的迭代器角度分析,vector容器对应的迭代器为随机访问迭代器,而list容器内置的迭代器则为双向迭代器. 我们也知道,STL中提供的很多算法都是基于随机访问迭代器的,如sort(b,e)函数,其所使用的迭代器就是随机访问迭代器,所以,list不能使用这类

STL&lt;一&gt;:主要容器简介

vector : 向量 list : 双向链表容器,提供数据结构中链表的所有功能 queue : 队列容器,提供数据结构中队列的所有功能 stack : 栈容器,提供数据结构中栈的所有功能 deque : 双端栈容器,提供数据结构中栈的所有功能 priority_queue : 优先队列,一种按值排序的队列容器 set : 集合容器 multiset : 允许出现重复元素的集合容器 map<key,value> ; 关联数组容器 multimap<key,value> : 允许出现