STL快速入门学习教程之list的简单使用
list概述
list使用一个double link list(双向链表)的形式来存储元素。
list和vector都是序列式的容器,现在我们来谈谈它们之间的差异,它们之间唯一的区别就是;Vector是以一段连续的内存空间进行存储,list则是以不连续的内存空间进行存储,我们可以很快的联想到线性表的顺序存储结构和链式存储结构,如果你有数据结构的基础知识,我相信你很快就能够理解它们。list以不连续的存储结构进行数据的存储,相比Vector来说,list在插入数据和删除数据时,只需要分配或释放一个元素的内存空间即可,缺点:随机访问比较慢。
1.Vector多以存储基本数据类型,而List多以存储复合数类型,下面我以存储结构体的形式介绍List的用法。
2.这仅仅是作者个人观点,具体使用情况还得考虑具体要求以及环境需求。
list节点
根据自己需要存储的数据形式定义一个结构体作为存储节点,作者简单的定义一个Mylist_node结构。
struct Mylist_node
{
int id;
char *ch;
};
构造函数
- list< type> listname;//创建空链表
- list< type> listname(5);//创建一个含有默认值都为0的链表
- list< type> listname(5,2);//创建含有5个元素且值都为2的链表
- list< type> listname(listname1);//建立一个listname1的复制链表
- list< type> listname(listname1.begin(),listname1.end());//listname是由listname1的区域元素。
成员函数
listname.begin() //返回指向首元素的迭代器
listname.end() //返回指向尾部元素的迭代器
void print_node(Mylist_node &d)
{
cout << d.id << " " << d.ch <<endl;
}
void list_node_init()
{
Mylist_node no = { 1001,"李明" };
list<Mylist_node> stu(5,no);
for_each(stu.begin(), stu.end(), print_node);
}
listname.rbegin()//返回逆向链表的第一个元素,即原链表的最后一个元素。
listname.rend()//返回逆向链表的最后一个元素的下一个元素,即原链表的第一个元素的前一个位置。
元素添加和删除
push_back() //在List的末尾添加一个元素
push_front() //在List的头部添加一个元素
pop_back() //删除最后一个元素
pop_front() //删除第一个元素
完整代码
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
struct Mylist_node
{
int id;
const char *ch;
};
ostream &operator << (ostream &os, Mylist_node & node_li)
{
os << node_li.id << " " << node_li.ch << endl;
return os;
}
void print_node(Mylist_node &d)
{
cout << d.id << " " << d.ch << endl;
}
void list_node_init()
{
Mylist_node no0 = { 1000,"王翔" };
Mylist_node no1 = { 1001,"李明" };
Mylist_node no2 = { 1002,"李四" };
Mylist_node no3 = { 1003,"王强" };
Mylist_node no4 = { 1004,"刘刚" };
Mylist_node no5 = { 1005,"韦晓" };
list<Mylist_node> stu(1, no1); //使用构造函数初始化list
//使用push_back(),将数据插入list的尾部
//下面为插入四个Mylist_node结构的数据
stu.push_back(no2);
stu.push_back(no3);
stu.push_back(no4);
stu.push_back(no5);
stu.push_front(no0); //在list头部添加元素no0
stu.resize(3); //设置list大小为3
cout<<stu.size()<<endl; //显示当前list的大小
//stu.pop_back(); //删除list最后一个元素
//stu.pop_front(); //删除list头部元素
//将List中的元素输出
for_each(stu.begin(), stu.end(), print_node);
//判断list是否为空
//返回0表示不为空,返回1,表示为空
list<Mylist_node> stu1;
cout<<stu.empty()<<endl;
cout<<stu1.empty()<<endl;
//使用迭代器输出list元素
list<Mylist_node>::iterator li;
for (li = stu.begin();li != stu.end();li++)
{
cout << *li << endl;
}
}
int main()
{
//list<int> li;
//li.push_back(1);
//li.push_back(2);
//li.push_back(3);
//li.push_back(3);
//li.push_back(5);
list_node_init();
//system("pause");
return 0;
}
去掉 行:(//stu.pop_back(); //删除list最后一个元素)中的注释,运行结果:
去掉 行:(//stu.pop_front(); //删除list头部元素)中的注释,运行结果:
改变list的大小
listname.resize(3) //设置list大小为3
容器当前大小为3(容器中只含有3个元素):
判断list是否为空
listname.empty()//判断list是否为空, 返回0表示不为空,返回1,表示list为空。
使用迭代器输出list
关于list还有很多内容,后面将会补充。
版权声明
内容均由作者学习整理提供,未经作者允许不得转载
关于作者更多请转至:网站