<C++> list容器本质|常用接口|自定义排序规则(上)

简介: <C++> list容器本质|常用接口|自定义排序规则

1、list 容器本质与特点

本质:


list 容器可以看做一个双向循环链表,用于存储的每个结点包含数据域和指针域


示意图:

601856102e3d47dbbe2b61f097075113.png

名词解释:


begin和end都是迭代器,可以看成指针来操作

begin 对应的是容器首个元素,而end 对应容器最后一个元素的下一个位置

prev和next代表前驱指针和后继指针,并不是 list容器的接口

指针域用来存储下一个结点的地址

front和back分别是第一个和最后一个结点的数据域

push_back、push_front、pop_back、pop_front代表尾插、头插、尾删、头删

通过前驱后继指针可以将每个结点连接起来,头结点的前驱与尾结点后继指针都指向null

由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器


list 特点:


优点:可以对任意位置快速插入删除,动态分配存储,不会造成内存浪费和溢出

缺点:遍历速度比数组慢,占用空间比数组大

list 有一个重要的性质,插入和删除操作都不会造成原有 list迭代器的失效


2、list 基本操作与常用接口

包含 list容器的构造、赋值交换、插入删除、数据存取、空间大小、反转、排序。


2.1、list 构造函数

用于创建list容器

函数原型:


list<T> lst;

采用模板类实现,对象的默认构造形式

list(beg,end);

构造函数将[beg, end)区间中的元素拷贝给本身。

list(n,elem);

构造函数将n个elem拷贝给本身。

list(const list &lst);

拷贝构造函数

示例:

#include<iostream>
#include <list>
using namespace std;
void printList(const list<int>& L) {
  for (list<int>::const_iterator it = L.begin(); it != L.end(); it++) {
    cout << *it << " ";
  }
  cout << endl;
}
void test()
{
  //默认构造
  list<int>L1;
  L1.push_back(10);
  L1.push_back(20);
  L1.push_back(30);
  printList(L1);
    //区间构造
  list<int>L2(L1.begin(),L1.end());
  printList(L2);
  //拷贝构造
  list<int>L3(L2);
  printList(L3);
  //相同值构造
  list<int>L4(10, 1000);
  printList(L4);
}

2.2、list 赋值和交换

用于给list容器进行赋值,以及交换list容器

函数原型:


assign(beg, end);

将[beg, end)区间中的数据拷贝赋值给本身

assign(n, elem);

将n个elem拷贝赋值给本身

list& operator=(const list &lst);

重载等号操作符

swap(lst);

将lst与本身的元素互换

示例:

//赋值和交换
void test01()
{
  list<int>L1;
  L1.push_back(10);
  L1.push_back(20);
  L1.push_back(30);
  //赋值
  list<int>L2;
  L2 = L1;
  list<int>L3;
  L3.assign(L2.begin(), L2.end());
  list<int>L4;
  L4.assign(10, 100);
}
//交换
void test02()
{
  list<int>L1;
  L1.push_back(10);
  L1.push_back(20);
  L1.push_back(30);
  list<int>L2;
  L2.assign(10, 100);
  cout << "交换前: " << endl;
  printList(L1);
  printList(L2);
  L1.swap(L2);
  cout << "交换后: " << endl;
  printList(L1);
  printList(L2);
}

2.3、list 大小操作

用于对list容器的大小进行操作

函数原型:


size();

返回容器中元素的个数

empty();

判断容器是否为空

resize(num);

重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

如果容器变短,则末尾超出容器长度的元素被删除。

resize(num, elem);

与resize(num)的区别是默认值变为elem

示例:


目录
相关文章
|
3月前
|
算法 C++ 容器
模拟实现c++中的list模版
模拟实现c++中的list模版
|
4月前
|
前端开发 JavaScript UED
React 拖拽排序组件 Draggable List
在现代Web应用中,拖拽排序功能显著提升用户体验。使用React结合`react-dnd`库,可以轻松创建高效且易于维护的拖拽排序组件。通过简单的拖拽操作,用户能直观调整列表项顺序,适用于任务管理、看板工具等场景。实现步骤包括项目初始化、安装依赖、创建基础组件、添加拖拽功能及管理状态和事件。常见问题如拖拽效果不流畅、顺序未更新等可通过性能优化、正确处理索引交换等方式解决。移动端支持也需考虑,确保跨平台的良好体验。
235 25
|
5月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
95 1
|
5月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
142 7
|
5月前
|
存储 编译器 C++
C++ initializer_list&&类型推导
在 C++ 中,`initializer_list` 提供了一种方便的方式来初始化容器和传递参数,而右值引用则是实现高效资源管理和移动语义的关键特性。尽管在实际应用中 `initializer_list&&` 并不常见,但理解其类型推导和使用方式有助于深入掌握现代 C++ 的高级特性。
50 4
|
7月前
|
存储 算法 C++
【C++打怪之路Lv10】-- list
【C++打怪之路Lv10】-- list
49 1
|
7月前
|
弹性计算 Kubernetes 网络协议
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
阿里云弹性网络接口技术的容器网络基础教程
|
6月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
113 0
|
7月前
|
存储 C++ 容器
C++入门9——list的使用
C++入门9——list的使用
45 1
|
7月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
140 2

热门文章

最新文章