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的时候 发现我们在实现函数写返回值和参数的时候既然可以用类名 也可以用类型
但是更推荐用类型也就是下面这种 虽然效率没有提示 但是可读性更高!