C++ STL 库 list 链表的基本定义及操作

list

双向链表
  • 比单向链表多了个指向前方向的指针
  • 与vector的区别:
    vector: 是一个数组
    (1)支持快速随机访问,即下标运算
    (2)尾添加,不申请空间的情况下非常快
    (3)插入和删除比较慢
    list: 是一个链表
    (1)随机访问慢,也支持下标
    (2)支持快速插入删除
头文件
#include <list>
using namespace std;
定义list的对象
	list<结构体> lb;
	list<int> lb;
	list<double> lb;
构造函数

五种构造函数:

struct Node{ //定义结构体 
	int a;
	char c;
};
 
void fun(Node& d){   //输出函数 
	cout << d.a << " " << d.c << "\n";  // \n换行比endl效率高点 
}
 
void Haha(){  //初始值为 0 
	list<Node> lb; //无参构造,其中没有元素 
	list<Node> lb1(5); //有五个元素,初始为 0 
	for_each(lb1.begin(), lb1.end(), fun);  //迭代器输出 
}

void Haha1(){  //初始化特定值 
	Node no = {7, 'a'};  
	list<Node> lb(3, no);  //','前表示一共多少个值,','后表示值是多少 
	list<Node> lb1(lb);  //用一个list来初始化当前的list 
	list<Node> lb2(lb.begin(), lb.end());  //用另一个对象中的一段来初始化当前list 
	for_each(lb.begin(), lb.end(), fun);  //输出 
	for_each(lb1.begin(), lb1.end(), fun);  //输出 
	for_each(lb2.begin(), lb2.end(), fun);
} 
定义list的迭代器
  • 形式:多了参数列表
  • 本质是int*指针,char就是char*指针
  • begin()指向头
  • end () 指向尾巴的下一个
  • 不能进行加法运算,可以自加 ++
void Haha2(){  //迭代器 
	Node no = {10, 'c'};
	list<Node> lb(2,no);
	list<Node>::iterator ite = lb.begin();
	ite++;
	list<Node> lb1(ite, lb.end());
	for_each(lb.begin(), lb.end(), fun);
	for_each(lb1.begin(), lb1.end(), fun);
} 
属性
  • 空间不连续,没有容量这个概念
  • 大小:
    (1) size : 元素个数
    (2)resize : 重新设置元素个数
    (3)empty :判断是否有元素,如果有元素,返回0,如果没有元素,返回 1
void Haha3(){  //元素个数 
	Node no = {15, 'f'};
	list<Node> lb(3,no);
	cout << lb.size() << endl; //输出元素个数 
	cout << lb.empty() << endl;  //判断是否为空,不是则返回 0 
	for_each(lb.begin(), lb.end(), fun);
	lb.resize(2);  //重新设置元素个数 
	cout << lb.size() << endl;  //输出元素个数 
	for_each(lb.begin(), lb.end(), fun);
	lb.resize(0);  //将元素个数设置为 0个 
	cout << lb.empty() << endl; // 没有元素,输出 1 
} 
查操作
  • 输出全部
    (1)for循环加迭代器
    (2)for_each 函数
    (3)迭代器
  • 输出单个元素
    (1)不支持下标运算
    (2)back () : 返回尾巴元素
    (3)front() : 返回第一个元素
void Cout(){
	Node no = {11, 'q'};
	list<Node> lb(4,no);
	for(list<Node>::iterator ite = lb.begin(); ite != lb.end(); ite++){
		cout << ite->a << " " << ite->c << endl;
	}
	cout << lb.back().a << " " << lb.back().c << endl; 
	cout << lb.front().a << " " << lb.front().c << endl;
}  

主要代码如下:

#include <iostream>
#include <algorithm>  //for_each函数头文件 
#include <list>  //list头文件 
using namespace std;
 
struct Node{ //定义结构体 
	int a;
	char c;
};
 
void fun(Node& d){   //输出函数 
	cout << d.a << " " << d.c << "\n";  // \n换行比endl效率高点 
}
 
void Haha(){  //初始值为 0 
	list<Node> lb; //无参构造,其中没有元素 
	list<Node> lb1(5); //有五个元素,初始为 0 
	for_each(lb1.begin(), lb1.end(), fun);  //迭代器输出 
}

void Haha1(){  //初始化特定值 构造函数 
	Node no = {7, 'a'};  
	list<Node> lb(3, no);  //','前表示一共多少个值,','后表示值是多少 
	list<Node> lb1(lb);  //用一个list来初始化当前的list 
	list<Node> lb2(lb.begin(), lb.end());  //用另一个对象中的一段来初始化当前list 
	for_each(lb.begin(), lb.end(), fun);  //输出 
	for_each(lb1.begin(), lb1.end(), fun);  //输出 
	for_each(lb2.begin(), lb2.end(), fun);  //输出 
} 

void Haha2(){  //迭代器 
	Node no = {10, 'c'};
	list<Node> lb(2,no);
	list<Node>::iterator ite = lb.begin();  
	ite++;  // ite只可 ++,不可以进行运算 ite++(对),ite+2(错) 
	list<Node> lb1(ite, lb.end());  
	for_each(lb.begin(), lb.end(), fun); //输出 
	for_each(lb1.begin(), lb1.end(), fun);  //输出 
}
void Haha3(){  //元素个数 
	Node no = {15, 'f'};
	list<Node> lb(3,no);
	cout << lb.size() << endl; //输出元素个数 
	cout << lb.empty() << endl;  //判断是否为空,不是则返回 0 
	for_each(lb.begin(), lb.end(), fun);
	lb.resize(2);  //重新设置元素个数 
	cout << lb.size() << endl;  //输出元素个数 
	for_each(lb.begin(), lb.end(), fun);
	lb.resize(0);  //将元素个数设置为 0个 
	cout << lb.empty() << endl; // 没有元素,输出 1 
} 

void Cout(){
	Node no = {11, 'q'};
	list<Node> lb(4,no);
	for(list<Node>::iterator ite = lb.begin(); ite != lb.end(); ite++){
		cout << ite->a << " " << ite->c << endl;
	}
	cout << lb.back().a << " " << lb.back().c << endl; 
	cout << lb.front().a << " " << lb.front().c << endl;
}  

int main(){  //主函数 
	Haha();
	Haha1();
	Haha2();
	Haha3();
	Cout();
	system("pause");
	return 0;
}
发布了12 篇原创文章 · 获赞 45 · 访问量 3873

猜你喜欢

转载自blog.csdn.net/weixin_45897672/article/details/103927656