一,概述
List将元素按顺序储存在链表中.与向量(vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢。
list 不仅是一个双向链表,而且是一个环状双向链表
二,使用
#include <list>
using namespace std;
注意:list是一个“前闭后开”的区间,即
list<int> lt(10,6); //建立10个元素为6的链表
cout<<*(lt.end()) ; //输出乱码
cout<<*(--lt.end());//输出最后一个元素 6
三,主要函数
assign()给list赋值
back()返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear()删除所有元素
empty()如果list是空的则返回true
end() 返回末尾的迭代器
erase()删除一个元素
front()返回第一个元素
get_allocator()返回list的配置器
insert(iteator,10) 插入一个元素10到元素迭代其 iteator之前,一般iteator=find(list.begin(),list.end(),3)
max_size() 返回list能容纳的最大元素数量
merge(list<T> &x) 将x合并到 *this
pop_back()删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front()在list的头部添加一个元素
rbegin()返回指向第一个元素的逆向迭代器
remove()从list删除元素
remove_if()按指定条件删除元素
rend()指向list末尾的逆向迭代器
resize()改变list的大小
reverse()把list的元素倒转
size()返回list中的元素个数
sort()给list排序
splice(iterator position ,list &x) // list.splice(position,list2) //list2合并到list中position 之前
splice(iterator position ,list &x,iterator i) // 元素插入到list中position 之前
splice(iterator position ,list &x,iterator first,iterator last) //first - last 之间的元素插入到 list中position之前
swap()
交换两个list
unique()
删除list中重复的元素
四,示例
#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>
using namespace std;
//创建一个list容器的实例LISTINT
typedef list<int> LISTINT;
//创建一个list容器的实例LISTCHAR
typedef list<char> LISTCHAR;
int main(void)
{
LISTINT listOne;//创建一个名为listOne的list对象
LISTINT::iterator i;//声明i为迭代器
listOne.push_front (2);//从list容器前面添加数据
listOne.push_front (1);
listOne.push_back (3);//从list容器后面添加数据
listOne.push_back (4);
cout<<"listOne.begin()--- listOne.end():"<<endl;//从后面显示数据
for (i = listOne.begin(); i != listOne.end(); ++i)
cout << *i << ""<<endl;
//从后向后显示listOne中的数据
LISTINT::reverse_iterator ir;
cout<<"listOne.rbegin()---listOne.rend():"<<endl;
for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {
cout << *ir << "";
}
cout << endl;
//使用STL的accumulate(累加)算法
int result = accumulate(listOne.begin(), listOne.end(),0);
cout<<"Sum="<<result<<endl;
cout<<"------------------"<<endl;
//--------------------------
//用list容器处理字符型数据
//--------------------------
//用LISTCHAR创建一个名为listOne的list对象
LISTCHAR listTwo;
//声明i为迭代器
LISTCHAR::iterator j;
//从前面向listTwo容器中添加数据
listTwo.push_front ('A');
listTwo.push_front ('B');
//从后面向listTwo容器中添加数据
listTwo.push_back ('x');
listTwo.push_back ('y');
//从前向后显示listTwo中的数据
cout<<"listTwo.begin()---listTwo.end():"<<endl;
for (j = listTwo.begin(); j != listTwo.end(); ++j)
cout << char(*j) <<" ";
cout << endl;
//使用STL的max_element算法求listTwo中的最大元素并显示
j=max_element(listTwo.begin(),listTwo.end());
cout << "The maximum element in listTwo is:"<<char(*j)<<endl;
return 0;
}
五,示例#include <iostream>
#include <list>
using namespace std;
typedef list<int> INTLIST; //定义双向链表
void put_list(INTLIST list,const char *name)//从前向后显示list队列的全部元素
{
INTLIST::iterator plist;
cout << "The contents of" << name << " : ";
for(plist = list.begin(); plist != list.end(); plist++)
cout << *plist << " ";
cout<<endl;
}
int main(void)
{
INTLIST list1; //list1对象初始为空
INTLIST list2(10,6); //list2对象最初有10个值为6的元素
INTLIST list3(list2.begin(),--list2.end());//list3对象最初有9个值为6的元素
INTLIST::iterator i; //声明一个名为i的双向迭代器
put_list(list1,"list1"); //从前向后显示各list对象的元素
put_list(list2,"list2");
put_list(list3,"list3");
list1.push_back(2);//从list1序列后面添加两个元素
list1.push_back(4);
cout<<"list1.push_back(2) and list1.push_back(4):"<<endl;
put_list(list1,"list1");
list1.push_front(5);//从list1序列前面添加两个元素
list1.push_front(7);
cout<<"list1.push_front(5) andlist1.push_front(7):"<<endl;
put_list(list1,"list1");
list1.insert(++list1.begin(),3,9);//在list1序列中间插入数据 3个9
cout<<"list1.insert(list1.begin()+1,3,9):"<<endl;
put_list(list1,"list1");
cout<<"list1.front()="<<list1.front()<<endl;//测试引用类函数
cout<<"list1.back()="<<list1.back()<<endl;
list1.pop_front();//从list1序列的前后各移去一个元素
list1.pop_back();
cout<<"list1.pop_front() and list1.pop_back():"<<endl;
put_list(list1,"list1");
list1.erase(++list1.begin());//清除list1中的第2个元素
cout<<"list1.erase(++list1.begin()):"<<endl;
put_list(list1,"list1");
list2.assign(8,1);//对list2赋值并显示
cout<<"list2.assign(8,1):"<<endl;
put_list(list2,"list2");
cout<<"list1.max_size(): "<<list1.max_size()<<endl;//显示序列的状态信息
cout<<"list1.size(): "<<list1.size()<<endl;
cout<<"list1.empty(): "<<list1.empty()<<endl;
put_list(list1,"list1");//list序列容器的运算
put_list(list3,"list3");
cout<<"list1>list3: "<<(list1>list3)<<endl;
cout<<"list1<list3: "<<(list1<list3)<<endl;
list1.sort();//对list1容器排序
put_list(list1,"list1");
list1.splice(++list1.begin(), list3);//将list3结合到 list1中 ++list1.begin()之前
put_list(list1,"list1");
put_list(list3,"list3");
return 0;
}
输出:The contents oflist1 :
The contents oflist2 : 6 6 6 6 6 6 6 6 6 6
The contents oflist3 : 6 6 6 6 6 6 6 6 6
list1.push_back(2) and list1.push_back(4):
The contents oflist1 : 2 4
list1.push_front(5) andlist1.push_front(7):
The contents oflist1 : 7 5 2 4
list1.insert(list1.begin()+1,3,9):
The contents oflist1 : 7 9 9 9 5 2 4
list1.front()=7
list1.back()=4
list1.pop_front() and list1.pop_back():
The contents oflist1 : 9 9 9 5 2
list1.erase(++list1.begin()):
The contents oflist1 : 9 9 5 2
list2.assign(8,1):
The contents oflist2 : 1 1 1 1 1 1 1 1
list1.max_size(): 357913941
list1.size(): 4
list1.empty(): 0
The contents oflist1 : 9 9 5 2
The contents oflist3 : 6 6 6 6 6 6 6 6 6
list1>list3: 1
list1<list3: 0
The contents oflist1 : 2 5 9 9
The contents oflist1 : 2 6 6 6 6 6 6 6 6 6 5 9 9
The contents oflist3 :
四,补充:STL标准函数find进行vector 、list链表查找
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
class example
{
public:
example(int val) // 构造函数
{
i = val;
}
bool operator==(example const & rhs) //操作符重载
{
return (i == rhs.i) ? true : false;
}
private:
int i;
};
int main(void)
{
vector<example> ve;
ve.push_back(1);
vector<example>::iterator it;
example elem(1);
it = find(ve.begin(), ve.end(), elem);
cout<<boolalpha<<(*it == elem); //boolalpha 用符号形式表示真假
return 0;
}
相关推荐
STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。...例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。
使用C++双向列表统计文章单词出现频率,其中双向列表模仿STL中的List.
对于C++的STL的双向链表,排序算法有的模板并没有实现,因此给出来,大家参考。
主要为大家详细介绍了C++ STL入门教程第二篇,list双向链表使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
实现c++ list部分功能,内存自管理 函数的使用和c++ stl list类似,并不完全相同 简单测试过,并不保证完全无错,仅供参考
第8章 list双向链表容器 第9章 slist单向链表容器 第10章 bit_vector位向量容器 第11章 set集合容器 第12章 multiset多重集合容器 第13章 map映照容器 第14章 multimap多重映照容器 第15章 hash_set哈希集合容器 第...
C++中STL的List链表容器的自行实现,自行实现迭代器、类、封装函数等
这篇文章是关于C++语言的一个新的扩展——标准模板库的(Standard Template Library),也叫STL,详细介绍了list的用法与应用
第8章 list双向链表容器 116 8.1 list技术原理 116 8.2 list应用基础 124 8.3 本章小结 131 第9章 slist单向链表容器 132 9.1 slist技术原理 132 9.2 slist应用基础 140 9.3 本章小结 148 第10章 ...
心希盼 c++ STL 单链表源码 主要仿照STL封装了单链表 包括 它的迭代器 详细请看“心希盼 List.doc”文件
使用C++ 代码编写的一个链表,类似于C++ STL中的容器list。可以放入任何类型的数据,通过迭代器访问链表。涉及到的技术很多。
第8章 list双向链表容器 116 8.1 list技术原理 116 8.2 list应用基础 124 8.3 本章小结 131 第9章 slist单向链表容器 132 9.1 slist技术原理 132 9.2 slist应用基础 140 9.3 本章小结 148 第10章 ...
C++链表基于类实现多项式的加法和乘法; C ++ list class-based polynomial addition and multiplication.
第8章 list双向链表容器 116 8.1 list技术原理 116 8.2 list应用基础 124 8.3 本章小结 131 第9章 slist单向链表容器 132 9.1 slist技术原理 132 9.2 slist应用基础 140 9.3 本章小结 148 第10章 ...
C++实现的模板链表类,没有用到STL的list,是用指针实现的。
STL 中的list 就是一 双向链表,可高效地进行插入删除元素。 list不支持随机访问。所以没有 at(pos)和operator[]。 list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) 。list< int>::iterator it; 构造...
2.2 C++ LIST(双向链表) 2.3 C++ DEQUE(双向队列) 2.4 三者比较 3 关联容器 3.1 特点 3.2 C++ SETS & MULTISETS 3.3 C++ MAPS & MULTIMAPS 4 容器适配器 4.1 特点 4.2 C++ STACKS(堆栈) 4.3 C++ QUEUES...
17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27红黑树_0 28红黑树_1 29红黑树_2 30红黑树_3 31红黑树_4 32红黑树_5 33红黑树_6 34堆 35堆排序 36...
C语言下开发的双链表算法,模拟C++中STL接口说明,可以在嵌入式C语言中直接使用。