8.list的使用

一.构造函数以及赋值

二.迭代器部分

三.容量和元素

四.成员函数

五.list的使用

cpp 复制代码
void test_list1()
{
	list<int> lt1 = { 10,2,3,3,4,3,5,6};
	list<int>::iterator it = lt1.begin();
	while (it != lt1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	//sort(lt1.begin(), lt1.end());
	lt1.sort();
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.sort(greater<int>());
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;

	lt1.unique();
	for (auto e : lt1)
	{
		cout << e << " ";
	}
	cout << endl;
}

但是list是双向迭代器,所以list不能使用std::sort

list里面的sort()使用的是归并排序

六.测试vector和list排序时的性能

cpp 复制代码
void test_op1()
{
	srand(time(0));
	const int N = 10000000;

	list<int> lt1;
	list<int> lt2;

	vector<int> v;

	for (int i = 0; i < N; ++i)
	{
		auto e = rand() + i;
		lt1.push_back(e);
		v.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);
}

几乎vector排序的销毁几乎是list的3倍

cpp 复制代码
void test_op2()
{
	srand(time(0));
	const int N = 10000000;

	list<int> lt1;
	list<int> lt2;

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

	int begin1 = clock();
	// 拷贝vector

	vector<int> v(lt2.begin(), lt2.end());
	// 排序
	sort(v.begin(), v.end());

	// 拷贝回lt2
	lt2.assign(v.begin(), v.end());

	int end1 = clock();

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

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

上面这个是先将list拷贝到vector排序完之后再拷贝会到list,结果用时还少

七.splice接口使用

cpp 复制代码
int main()
{
   std::list<int> mylist1, mylist2;
   std::list<int>::iterator it;

   // set some initial values:
   for (int i = 1; i <= 4; ++i)
       mylist1.push_back(i);      // mylist1: 1 2 3 4

   for (int i = 1; i <= 3; ++i)
       mylist2.push_back(i * 10);   // mylist2: 10 20 30

   it = mylist1.begin();
   ++it;                         // points to 2

   mylist1.splice(it, mylist2); // mylist1: 1 10 20 30 2 3 4
                                 // mylist2 (empty)
                                 // "it" still points to 2 (the 5th element

	return 0;
}

自己插入自己,如下:

cpp 复制代码
int main()
{
   std::list<int> mylist1;
  
   for (int i = 1; i <= 4; ++i)
       mylist1.push_back(i);      // mylist1: 1 2 3 4

   auto it = find(mylist1.begin(), mylist1.end(), 3);

   mylist1.splice(mylist1.begin(), mylist1, it);

   return 0;
}

如果要将后面的全部转移,就不要写三个参数了,只转移一个就要写第三个参数

cpp 复制代码
#include <iostream>
#include <list>

using namespace std;

// 打印链表内容的辅助函数
void printList(const list<int>& l, const string& name) {
    cout << name << ": ";
    for (int num : l) {
        cout << num << " ";
    }
    cout << endl;
}

int main() {
    list<int> list1 = {1, 2, 3};
    list<int> list2 = {4, 5, 6};
    
    printList(list1, "list1初始值");
    printList(list2, "list2初始值");
    
    // 1. 将list2的所有元素转移到list1的末尾
    list1.splice(list1.end(), list2);
    printList(list1, "list1转移后");  // 1 2 3 4 5 6
    printList(list2, "list2转移后");  // 空
    
    // 重新给list2赋值
    list2 = {7, 8, 9};
    printList(list2, "list2重新赋值");  // 7 8 9
    
    // 2. 将list2中第一个元素转移到list1的开头
    list1.splice(list1.begin(), list2, list2.begin());
    printList(list1, "list1转移单个元素后");  // 7 1 2 3 4 5 6
    printList(list2, "list2转移单个元素后");  // 8 9
    
    // 3. 将list2的所有元素转移到list1中值为3的元素前面
    auto it = find(list1.begin(), list1.end(), 3);
    if (it != list1.end()) {
        list1.splice(it, list2, list2.begin(), list2.end());
    }
    printList(list1, "list1转移范围元素后");  // 7 1 2 8 9 3 4 5 6
    printList(list2, "list2转移范围元素后");  // 空
    
    return 0;
}
相关推荐
linweidong2 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
郝学胜-神的一滴7 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
半桔7 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo7 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春8 小时前
C++之多重继承
c++·多重继承
颜酱8 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919108 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878388 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
DuHz9 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
Polaris北极星少女9 小时前
TRSV优化2
算法