C++ list

list需知:

list不会出现insert迭代器失效问题

链表插入不会影响原有数据相对位置,且不用扩容

但是erase会导致相对数据位置移动,所有其erase会导致迭代器失效
list排序效率很低 不建议使用 小规模数据量可以使用,比较方便

此外我们不能使用迭代器的时候不能用it<c.end

因为end是最后一个元素的后面的位置

此外链表的地址的大小是乱的

merge函数

 std::list  的  merge()  函数用于合并两个已排序的列表。此函数将所有元素从另一个列表移动到当前列表,并保持元素的排序。

使用比较器
如果你需要根据自定义的排序规则合并列表,可以使用第二个重载版本的  merge()  函数,该版本接受一个比较器参数:bool mycomparison(float a, float b) {
    return a < b; // 自定义比较规则
}

// 使用比较器合并
first.merge(second, mycomparison);注意事项

在合并之前,确保列表已经正确排序,否则结果可能不符合预期。
 merge()  函数假设两个列表使用相同的排序规则。如果规则不同,需要使用带比较器的版本。
 merge()  不会像某些其他标准库算法那样检查排序条件,它假定列表已经是排序的。

通过这些信息,你可以有效地使用  std::list  的  merge()  函数来处理已排序的列表合并。

unique函数

 

 std::unique  是 C++ 标准库中的一个算法,用于去除容器中相邻的重复元素。

 std::unique  函数需要两个参数,分别是容器的开始和结束迭代器。它会将所有相邻的重复元素移动到容器的末尾,并返回一个指向新结束位置的迭代器。
通常,在调用  std::unique  之前,容器中的元素应先排序,因为  std::unique  只能去除相邻的重复元素。
删除多余的元素 :

虽然  std::unique  不会改变容器的大小,但它会将重复的元素移至容器末尾。可以通过调用  std::list::erase  来删除这些重复的元素。

通过调用  sort()  方法对列表进行排序,然后使用  std::unique  处理重复的相邻元素,并通过  erase()  方法删除这些重复元素。最终,输出的是一个不包含相邻重复元素的列表。

 remove函数

remove相当于find+erase如果没找到 remove什么都不会做

splice函数

 (1)全部转移

 (2)转移某一个

 (3)转移某一部分

 splice 函数是C++标准模板库(STL)中的 list 容器的一个功能强大的方法,它允许将元素从一个列表移动到另一个列表,而不需要创建新元素,从而优化性能。 splice 函数有三种不同的重载方式:

移动整个列表 :void splice(iterator position, list& x);这个版本的 splice 会将列表 x 中的所有元素移动到列表 position 所指向的位置。列表 x 在操作后将变为空。

移动单个元素 :void splice(iterator position, list& x, iterator i);此版本的 splice 仅将列表 x 中由迭代器 i 指向的单个元素移动到 position 所指向的位置。

移动元素范围 :void splice(iterator position, list& x, iterator first, iterator last);这个版本的 splice 会将列表 x 中由迭代器 first 和 last 定义的范围内的元素移动到 position 所指向的位置。这个范围包括 first 指向的元素,但不包括 last 指向的元素。

这个操作不仅简单而且效率高,因为它避免了元素的复制,只是改变了元素在内存中的链接。

operator->函数

我们在自己写operator->的时候要注意 

operator->的使用场景

struct A
{
	A(int a1 = 0, int a2 = 0)
		:_a1(a1)
		, _a2(a2)
	{
	}

	int _a1;
	int _a2;
};
void test_list2()
{
	list<A> lt;
	lt.push_back(A(1, 1));
	lt.push_back(A(2, 2));
	lt.push_back(A(3, 3));
	lt.push_back(A(4, 4));

	list<A>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << (*it)._a1 << " " << (*it)._a2 << endl;
		cout << it->_a1 << " " << it->_a2 << endl;

		++it;
	}
	cout << endl;
}

传统写法与现代写法 

 

 我们在实现list的时候 发现我们在实现函数写返回值和参数的时候既然可以用类名 也可以用类型

但是更推荐用类型也就是下面这种 虽然效率没有提示 但是可读性更高!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值