链表list

链表我们在C语言数据结构中已经有笔记说明了,list和vector的区别其实就相对于数组和链表的区别

  1. vector是内存连续的结构,list是内存不连续的结构 二者的对比我之前已经在笔记中专门有一篇说这个的 传送门https://blog.cvpotato.cn/programing-language/107.html
    总之,根据他们特性的差异可以格局自己的具体场合来选择合适STL模型 以提高程序的性能为主

list的头文件和命名空间

#include<\list>
using namespace std;在std标准命名空间中

List的定义

list是动态链表 跟vector一样 他也能够应对各种类型,它是一个类模板 例如
list<int> list_int;//定义了一个内部元素是int的链表
list<char> list_int;//定义了一个内部元素是char的链表
list<Books> list_int;//定义了一个内部元素是Books的链表
list<char*> list_int;//定义了一个内部元素是char*的链表
而且容量大小没有限制

list的初始化

初始化的方法也是有多种,

#include <list>
int main (int argc, char* argv[])
{
  std::list<int> one;                                //定义一个空的、元素类型是 int 的 list 链表
  std::list<int> two(4,100);               //定义一个包含4个元素,每个元素的值都是100的 list 链表
  std::list<int> three(two.begin(),two.end());  //使用 two 这个对象的迭代器,从开始到结束的所有元素来初始化当前对象
  std::list<int> four(three);                       // 使用 three 这个对象来初始化当前对象
  
  int myints[] = {16,2,77,29};
  std::list<int> five (myints, myints + sizeof(myints) / sizeof(int) ); //使用一个普通的 int 数组来初始化当前对象

  return 0;
}

同时我们也可以通过

#include<list>
#include<vector>
using namespace std;

int main()
{
	vector<int>arr_int(20,2);
	list<int>arr_list(arr_int.begin(),arr_int.end());
}

将vector对象的数据初始化为list的数据

list的常用基本操作

list<\int> list_int;
① list_int.size();        //返回 list_int 链表元素的总个数
② list_int.front();        //返回 list_int 链表的第一个元素的值
③ list_int.back();        //返回 list_int 链表的最后一个元素的值
④ list_int.clear();        //清空 list_int 链表,即把里面的所有元素都删除
⑤ list_int.begin();        //返回 list_int 链表第一个数的迭代器
⑥ list_int.end();        //返回 list_int 链表最后一个数的迭代器
⑦ list_int.empty();        //判断 list_int 链表是否为空,如果为空则返回true,非空(有元素)则返回false
⑧ list_int.swap(v1);    //v1是另一个动态链表,将 list_int 和 v1 两个链表的元素互换
⑨ list_int.reverse();     //把 list 中的元素顺序倒转
⑩ list_int.sort();                    // 给list排序
a list_int.splice(list_int.begin(), list_2); //将两个list合并

list的动态插入

list 支持的动态插入也有多种方式:
①、调用 push_back 在尾部插入一个元素,只能是一个一个插入:list_int.push_back(3);
②、调用 push_front 在头部插入一个元素,只能是一个一个插入:list_int.push_front(2);
③、调用 insert 在第一个元素的前面插入一个元素,list_int.insert(list_int.begin(), 888);
④、调用 insert 在第一个元素的前面插入3个888元素,list_int.insert(list_int.begin(), 3, 888);

list 的动态删除

①、list_int.pop_back();    //删除 list_int动态链表的最后一个元素
②、list_int.erase(list_int.begin()); //删除第一个元素
③、list_int.erase(itor, list_int.end()); //删除中间的元素

list 的遍历

因为是 list 不是数组,所以不能用下标来遍历,只能用迭代器来遍历,如下:
for (list<\int>::iterator itor =list_int.begin(); itor !=list_int.end(); ++itor)
{
    int value = *itor;
    cout << “value = ” << value << endl;
}

homework

定义一个 int 类型的 list 动态链表,将以下元素:1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 插入到动态链表中。之后,使用 for 循环删除动态链表中的值为 3 的元素,并将结果输出出来!

#include<list>
#include<vector>
#include<iostream>
using namespace std;

int main()
{
	int arr_list[] = { 1, 4, 3, 7, 9, 3, 6, 8, 3, 5, 2, 3, 7 };
	list<int> list_(arr_list, arr_list + sizeof(arr_list) / sizeof(int));
	for (list<int>::iterator pr = list_.begin(); pr!= list_.end(); pr++)
	{
		if (*pr == 3)
		{
			pr = list_.erase(pr);
		}
		cout << " list_ = :" << *pr;
	}
}

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c/243/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 6天前
下一篇 6天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注