链表_ 建立及访问1

preview
需积分: 0 0 下载量 151 浏览量 更新于2022-08-08 收藏 27KB DOCX 举报
链表是一种线性数据结构,其中的元素不是在内存中连续存储的,而是通过指针相互连接。在C++的STL(Standard Template Library,标准模板库)中,`std::list`是一个双链表实现,它提供了高效插入和删除元素的能力。然而,由于链表的特性,它不支持随机访问,因此没有类似于数组的`at()`和`operator[]`操作。 创建一个`std::list`可以使用构造函数,如`list<int> L0;`创建一个空链表,`list<int> L1(9);`创建一个包含9个默认值(通常是`int`类型的默认值0)的链表,或者`list<int> L2(5,1);`创建一个包含5个值均为1的链表。复制链表可以通过`list<int> L3(L2);`实现,而`list<int> L4(L0.begin(), L0.end());`则用于创建一个与`L0`相同元素的链表。 `std::list`提供了多种操作方法: 1. `assign()`方法用于分配新的元素序列,例如`L1.assign(4,3);`将`L1`设置为`(3,3,3,3)`,而`L1.assign(list1.begin()+1, list2.end());`则将`L1`设置为`(2,3)`。 2. `operator=`用于赋值,如`L1 = list1;`将`L1`的值复制为`list1`的值。 3. `front()`返回第一个元素的引用,`back()`返回最后一个元素的引用,可用于读取或修改这些元素。 4. `begin()`返回第一个元素的迭代器,`end()`返回指向最后一个元素之后的位置的迭代器。`rbegin()`返回反向迭代器,指向最后一个元素,而`rend()`则指向第一个元素之后的位置(反向迭代器)。 5. `push_back()`和`push_front()`分别用于在链表尾部和头部插入元素,如`list1.push_back(4);`会在`list1`末尾添加元素4。 6. `pop_back()`和`pop_front()`用于删除链表尾部和头部的元素。 7. `clear()`清除链表中的所有元素。 8. `erase()`用于删除单个元素或指定范围的元素,`remove()`删除所有与给定值匹配的元素,`remove_if()`删除满足特定条件的元素(通常配合自定义函数对象使用)。 9. `empty()`检查链表是否为空,`max_size()`返回链表的最大可能长度,`size()`返回当前元素数量。 10. `resize()`可以改变链表的大小,可以指定新大小并用默认值填充新元素,或只更改大小。 11. `reverse()`反转链表中的元素顺序。 12. `sort()`对链表进行排序,`merge()`合并两个已排序的链表并保持排序,`splice()`用于合并两个链表,`insert()`可以在指定位置插入一个或多个元素。 13. `unique()`删除相邻的重复元素,确保链表中相邻元素不相等。 通过这些方法,开发者可以灵活地创建、操作和管理`std::list`,实现各种数据处理需求。虽然链表在随机访问性能上不如数组,但在需要频繁插入和删除元素的情况下,`std::list`提供了更高效的解决方案。