[C++]list的介绍及使用

这篇具有很好参考价值的文章主要介绍了[C++]list的介绍及使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

C++:list的介绍及使用

                        list的介绍

                        list的使用

                                list的定义方式

                                list的插入和删除

                                push_front 和 pop_front

                                push_back 和 pop_back

                ​​​​​​​        ​​​​​​​        insert和​​erase

                ​​​​​​​        list的迭代器使用

                ​​​​​​​        ​​​​​​​        begin和end

                ​​​​​​​        ​​​​​​​        rbegin和rend

                        list的迭代器失效问题

                ​​​​​​​        ​​​​​​​list的元素获取

                                front和back

                        ​​​​​​​list的大小控制

                ​​​​​​​                size

                ​​​​​​​        ​​​​​​​        resize

                ​​​​​​​        ​​​​​​​        empty

                ​​​​​​​        ​​​​​​​        clear

                ​​​​​​​        list的操作函数

                ​​​​​​​        ​​​​​​​        sort

                ​​​​​​​        ​​​​​​​        splice

                ​​​​​​​        ​​​​​​​        remove

                ​​​​​​​        ​​​​​​​        remove_if

                ​​​​​​​        ​​​​​​​        unique

                ​​​​​​​        ​​​​​​​        merge

                ​​​​​​​        ​​​​​​​        reverse

                ​​​​​​​        ​​​​​​​        assign

                ​​​​​​​        ​​​​​​​        ​​​​​​​swap

                        list与vector的对比


C++:list的介绍及使用

list的介绍

[C++]list的介绍及使用,1024程序员节,c++,开发语言

1.list是一种可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代.

2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素.

3.list与forward_list非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代.

4.与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高.

5.list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)

list的使用

list的定义方式

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList1()
{
	list<int> lt1;                         
	list<int> lt2(4, 100);                
	list<int> lt3(lt2.begin(), lt2.end());  
	list<int> lt4(lt3); 

	// 以数组为迭代器区间构造l5
	int arr[] = { 16,2,77,29 };
	list<int> lt5(arr, arr + sizeof(arr) / sizeof(int));

	// 列表格式初始化C++11
	list<int> lt6{ 1,2,3,4,5 };

	// 用迭代器方式打印l5中的元素
	list<int>::iterator it = lt5.begin();
	while (it != lt5.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

[C++]list的介绍及使用,1024程序员节,c++,开发语言

list的插入和删除

push_front 和 pop_front

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void PrintList(const list<int>& lt)
{
	list<int>::const_iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		//*it = 10; 编译不通过
		++it;
	}
	cout << endl;
}
void TestList2()
{
	int arr[] = { 1, 2, 3 };
	list<int> lt(arr, arr + sizeof(arr) / sizeof(arr[0]));

	lt.push_front(0);
	PrintList(lt);

	lt.pop_front();
	PrintList(lt);
}
int main()
{
	TestList2();
	return 0;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

push_back 和 pop_back

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void PrintList(const list<int>& lt)
{
	list<int>::const_iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
void TestList3()
{
	int arr[] = { 1, 2, 3 };
	list<int> lt(arr, arr + sizeof(arr) / sizeof(arr[0]));

	lt.push_back(4);
	PrintList(lt);

	lt.pop_back();
	PrintList(lt);
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

insert和erase

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList4()
{
	int arr[] = { 1, 2, 3 };
	list<int> lt(arr, arr + sizeof(arr) / sizeof(arr[0]));

	list<int>::iterator pos = ++lt.begin();
	cout << *pos << endl;

	lt.insert(pos, 4);
	PrintList(lt);

	lt.insert(pos, 5, 5);
	PrintList(lt);

	vector<int> v{ 7, 8, 9 };
	lt.insert(pos, v.begin(), v.end());
	PrintList(lt);

	lt.erase(pos);
	PrintList(lt);

	lt.erase(lt.begin(), lt.end());
	PrintList(lt);
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

list的迭代器使用

begin和end

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList5()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	list<int> lt(arr, arr + sizeof(arr) / sizeof(arr[0]));
	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

rbegin和rend

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList6()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	list<int> lt(arr, arr + sizeof(arr) / sizeof(arr[0]));
	list<int>::iterator it = lt.begin();
	list<int>::reverse_iterator rit = lt.rbegin();
	while (rit != lt.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

list的迭代器失效问题

前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的结点失效,即该结点被删除了,因为list的底层结构为带哨兵位的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响.

[C++]list的介绍及使用,1024程序员节,c++,开发语言

[C++]list的介绍及使用,1024程序员节,c++,开发语言

list的元素获取

front和back

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList9()
{
	list<int> lt;
	lt.push_back(0);
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	cout << lt.front() << endl;
	cout << lt.back() << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

list的大小控制

size

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList10()
{
	list<int> lt;
	lt.push_back(0);
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	cout << lt.size() << endl;
}
int main()
{
	TestList10();
	return 0;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

resize

[C++]list的介绍及使用,1024程序员节,c++,开发语言

resize的两种情况:

1.当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值.

2.当所给值小于当前的size时,将size缩小到该值.

void TestList11()
{
	list<int> lt(5, 3);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.resize(7, 6);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.resize(2);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

empty

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList12()
{
	list<int> lt;
	cout << lt.empty() << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

clear

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList13()
{
	list<int> lt(5, 2);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	cout << lt.size() << endl;
	lt.clear();
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << lt.size() << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

list的操作函数

sort

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestOP1()
{
	srand(time(0));
	const int N = 1000000;
	vector<int> v;
	v.reserve(N);
	list<int> lt1;

	for (int i = 0; i < N; ++i)
	{
		int e = rand();
		v.push_back(e);
		lt1.push_back(e);
	}
	int begin1 = clock();
	sort(v.begin(), v.end());
	int end1 = clock();

	int begin2 = clock();
	lt1.sort();
	int end2 = clock();

	printf("vector sort:%d\n", end1 - begin1);
	printf("list sort:%d\n", end2 - begin2);
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestOP2()
{
	srand(time(0));
	const int N = 100000;
	vector<int> v;
	v.reserve(N);

	list<int> lt1;
	list<int> lt2;
	for (int i = 0; i < N; ++i)
	{
		auto e = rand();
		lt1.push_back(e);
		lt2.push_back(e);
	}

	int begin1 = clock();
	for (auto e : lt1)
	{
		v.push_back(e);
	}
	sort(v.begin(), v.end());
	size_t i = 0;
	for (auto& e : lt1)
	{
		e = v[i++];
	}
	int end1 = clock();

	int begin2 = clock();
	lt2.sort();
	int end2 = clock();

	printf("copy vector sort:%d\n", end1 - begin1);
	printf("list sort:%d\n", end2 - begin2);
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

splice

[C++]list的介绍及使用,1024程序员节,c++,开发语言

splice函数用于两个list容器之间的拼接,其有三种拼接方式:

1.将整个容器拼接到另一个容器的指定迭代器位置

2.将容器当中的某一个数据拼接到另一个容器的指定迭代器位置

3.将容器指定迭代器区间的数据拼接到另一个容器的指定迭代器位置

void TestList14()
{
	list<int> lt1(4, 2);
	list<int> lt2(4, 6);
	lt1.splice(lt1.begin(), lt2);
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	list<int> lt3(4, 2);
	list<int> lt4(4, 6);
	lt3.splice(lt3.begin(), lt4, lt4.begin());
	for (auto e : lt3)
	{
		cout << e << " ";
	}
	cout << endl;

	list<int> lt5(4, 2);
	list<int> lt6(4, 6);
	lt5.splice(lt5.begin(), lt6, lt6.begin(), lt6.end());
	for (auto e : lt5)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

注意:容器当中被拼接到另一个容器的数据在原容器当中就不存在了,实际上就是将链表中的指定结点拼接到了另一个容器中

remove

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList15()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(4);
	lt.push_back(3);
	lt.push_back(3);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(2);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.remove(3);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

remove_if

[C++]list的介绍及使用,1024程序员节,c++,开发语言

bool Odd(const int& val)
{
	return val % 2 == 0;
}
void TestList16()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	lt.push_back(6);
	lt.push_back(7);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.remove_if(Odd);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

unique

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList17()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(4);
	lt.push_back(3);
	lt.push_back(3);
	lt.push_back(2);
	lt.push_back(2);
	lt.push_back(3);
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	lt.sort();
	lt.unique();
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

merge

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList18()
{
	list<int> lt1;
	lt1.push_back(3);
	lt1.push_back(8);
	lt1.push_back(1);
	list<int> lt2;
	lt2.push_back(6);
	lt2.push_back(2);
	lt2.push_back(9);
	lt2.push_back(5);
	lt1.sort();
	lt2.sort();
	lt1.merge(lt2);
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

reverse

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList19()
{
	list<int> lt1;
	lt1.push_back(1);
	lt1.push_back(2);
	lt1.push_back(3);
	lt1.push_back(4);
	lt1.push_back(5);
	lt1.reverse();
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

assign

[C++]list的介绍及使用,1024程序员节,c++,开发语言

void TestList20()
{
	list<char> lt(3, 'a');
	lt.assign(3, 'b');
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
	
	string s("hello world");
	lt.assign(s.begin(), s.end());
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言

swap

void TestList8()
{
	int arr[] = { 1, 2, 3 };
	list<int> lt1(arr, arr + sizeof(arr) / sizeof(arr[0]));
	list<int> lt2{ 4,5,6 };
	lt1.swap(lt2);
	PrintList(lt1);
	PrintList(lt2);
}

[C++]list的介绍及使用,1024程序员节,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-739744.html

list与vector的对比:

vector list
底层结构 动态顺序表,一段连续空间 带头结点的双向循环链表
随机访问 支持随机访问,访问某个元素效率O(1) 不支持随机访问,访问某个元素效率O(N)
插入和删除 头部和中间插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低 任意位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)
迭代器 SGI版本下为原生态指针 对结点指针进行封装
迭代器失效 在插入元素时,要给迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值否则一定会失效 插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受影响
空间利用率 底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高 底层结点动态开辟,小结点容易造成内存碎片,空间利用率低,缓存利用率低,容易造成缓存污染
使用场景 需要高效存储,支持随机访问,插入删除多为尾插尾删 大量头部中部插入删除

到了这里,关于[C++]list的介绍及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 好用且免费的CodeWhisperer,给1024程序员节送礼来了

          国庆期间没有胆量去人从众的景点,关在家里刷手机时意外在亚马逊的User Group公众号上发现了CodeWhisperer这么个好东西(bu yao qian),以后撸代码也可以提高生产力(fang yang mo yu)了,这还不赶紧上手试一下。看官方介绍说它支持流行的IDE开发工具,包括VS Code、Intelli

    2024年02月08日
    浏览(39)
  • 1024程序员节带你玩转图片Exif信息获取之JavaScript

    目录 一、前言 二、背景 三、Exif.js          1、Exif.js 简介 2、Exif.js 引入 四、多场景展示数据获取 1、原始图片直接获取  2、base64 编码文件加载  3、文件上传的方式加载  五、总结        1024是2的十次方,二进制计数的基本计量单位之一。1G=1024M,而1G与1级谐音,也有一

    2024年02月20日
    浏览(38)
  • 1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

    Spring实战系列文章: Spring实战 | Spring AOP核心秘笈之葵花宝典 Spring实战 | Spring IOC不能说的秘密? 国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题

    2024年02月08日
    浏览(60)
  • 1024程序员节特辑 | ELK+ 用户画像构建个性化推荐引擎,智能实现“千人千面”

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月07日
    浏览(61)
  • 1024程序员狂欢节 | IT前沿技术、人工智能、数据挖掘、网络空间安全技术

    一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理了前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术,四大热点领域近期

    2024年02月06日
    浏览(55)
  • 1024程序员节?我们整点AI绘图玩玩吧,一文教你配置stable-diffusion

    需提前准备:一台高性能的电脑(尤其是显存)、python、Git、梯子。 其实Github上有很多关于Stable diffusion的库,综合对比之后,我选取的是比较全面的AUTOMATIC1111这个,源码链接:Stable-diffusion(Github) 找到安装那块的教程,此教程以windows为例。 ps:如果你电脑上已经有了pyt

    2024年01月16日
    浏览(58)
  • 1024程序员节特辑 | 解密Spring Cloud Hystrix熔断提高系统的可用性和容错能力

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    浏览(40)
  • 想转行做程序员,该怎么选择开发语言?哪个岗位工资最高?

    本文主要针对零基础想了解或者转行从事开发岗的同学。 我们收集了往届毕业同学和一些正在咨询的同学,发现大家在学习初期,对转行互联网做开发,最多的疑问或者顾虑大体分为几类: 现在哪门语言比较火? 学什么语言好找到工作? XX语言是不是饱和了? ... 其实语言

    2024年02月02日
    浏览(46)
  • 程序员必备:GitHub访问神器FastGithub使用介绍

    GitHub作为程序员访问最频繁的网站,程序员们经常需要访问Github找开源项目、学习新框架、管理自己的个人开源项目等等。因为GitHub属于国外的网站,直接访问的话,速度非常慢,甚至访问不了,今天给大家推荐FastGitHub这款开源项目可以很好的解决国内程序员访问GitHub的困扰

    2024年02月05日
    浏览(54)
  • 1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

    🌹欢迎来到 爱书不爱输的程序猿 的博客, 本博客致力于知识分享,与更多的人进行学习交流 🚩🚩🚩 点击直达福利 一年一度的1024程序员狂欢节又到啦!成为更卓越的自己,坚持阅读和学习,别给自己留遗憾,行动起来吧! 那么,都有哪些好书值得入手呢?小编为大家整理

    2024年02月08日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包