【C++打怪之路Lv10】-- list

🌈 个人主页:白子寰

🔥 分类专栏:重生之我在学Linux,C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~

💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

什么是list

list的特点

list常用的函数接口

构造函数

1)无参构造

2)用n个val值构造

3)拷贝构造函数

4)用迭代器进行初始化构造

容量操作接口

1)sizesize)

2)emptyempty)

3)resizeresize)

访问和遍历

1)迭代器(正向迭代器和反向迭代器)

2)front and backfront and back)

list的增删查改

1)push_frontpush_front)

2)push_backpush_back)

3)pop_frontpop_front)

4)pop_backpop_back)

5)findfind)

6)insertinsert)

7)eraseerase)

8)swapswap)

9)assignassign)

10)clearclear)

list顺序修改接口


什么是list

在C++中,list是一种序列容器,属于标准模板库(STL)的一部分。

它是一个双向链表 ,可以高效地进行插入和删除操作,尤其是在序列的中间部分

list的特点

  1. 动态数组list是一个动态数组,其长度可以根据需要增长或缩小。

  2. 双向链表:每个节点包含数据和两个指针,分别指向前一个和后一个节点,允许双向遍历。

  3. 插入和删除操作高效:在任何位置插入或删除元素都非常快速,因为不需要移动其他元素。

  4. 没有随机访问list不支持通过索引直接访问元素,访问必须从头开始迭代。

  5. 内存分配:元素可以非连续地存储在内存中,无需连续的内存块。

  6. 迭代器:提供双向迭代器,可以向前和向后遍历。

  7. 常用成员函数 :如push_back, push_front, pop_back, pop_front, insert, erase, splice等,用于链表操作。

小结: 选择使用list还是其他容器(如vector或deque)取决于具体的应用场景和性能需求。如果应用需要频繁地在序列中间插入或删除元素,list是一个很好的选择。

如果需要快速随机访问元素,则vector可能是更好的选择。


list常用的函数接口

构造函数

1)无参构造

cpp 复制代码
list();

创建一个空的list容器,不包含任何元素

2)用n个val值构造

cpp 复制代码
list(size_t n, const value_type& val = value_type());

创建一个包含n个元素的list容器,所有元素都被初始化为val的副本。

如果不提供val参数,则使用默认构造函数初始化元素

3)拷贝构造函数

cpp 复制代码
list(const list& x);

创建一个新的list容器,它是另一个同类型list容器x的副本。

这个构造函数会复制x中的所有元素到新的容器中

4)用迭代器进行初始化构造

cpp 复制代码
template <class InputIterator>
list(InputIterator first, InputIterator last);

创建一个list容器,并用迭代器范围[first, last)中的元素来初始化它。

这个构造函数可以用来从一个已存在的容器或者迭代器指定的序列中复制元素到新的list容器中。InputIterator可以是任何能够提供输入迭代器功能的迭代器类型



容量操作接口

1)size

cpp 复制代码
size_t size() const;

返回list中实际元素的个数。

这个操作的时间复杂度是常数时间O(1),因为它不需要遍历整个容器来计算元素的数量

2)empty

cpp 复制代码
bool empty() const;

检查list是否为空,即是否不包含任何元素。

如果容器为空,则返回true;否则返回false

这个操作同样具有常数时间复杂度O(1)

3)resize

cpp 复制代码
void resize(size_type n);
void resize(size_type n, const value_type& val);

调整list容器的大小以包含n个元素。

如果n小于当前容器的大小,则删除末尾的元素以缩小容器。

如果n大于当前容器的大小,则通过在末尾插入新元素来扩展容器。

如果提供了第二个参数val,那么新添加的元素会被初始化为val的副本;如果没有提供第二个参数,则使用默认构造函数来初始化新元素



访问和遍历

1)迭代器(正向迭代器和反向迭代器)

cpp 复制代码
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
  • begin() 返回指向容器中第一个元素的迭代器。
  • end() 返回指向容器中最后一个元素之后位置的迭代器。
  • rbegin() 返回指向容器中最后一个元素的逆向迭代器。
  • rend() 返回指向容器中第一个元素之前位置的逆向迭代器。
  • const_iteratorconst_reverse_iterator 类型的迭代器只能用于读取元素,不能用于修改元素。

2)front and back

cpp 复制代码
reference front();
const_reference front() const;
reference back();
const_reference back() const;
  • front() 返回对容器中第一个元素的引用。
  • back() 返回对容器中最后一个元素的引用。
  • const_reference 类型的引用只能用于读取元素,不能用于修改元素


list的增删查改

1)push_front

cpp 复制代码
void push_front(const value_type& val);

list的开始处插入一个新元素,这个元素是val的副本

2)push_back

cpp 复制代码
void push_back(const value_type& val);

list的末尾添加一个新元素,这个元素是val的副本

3)pop_front

cpp 复制代码
void pop_front();

删除list中的第一个元素

4)pop_back

cpp 复制代码
void pop_back();

删除list中的最后一个元素

5)find

cpp 复制代码
template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val);

list中查找值为val的第一个元素,返回一个指向该元素的迭代器,如果未找到则返回last

注意: find不是list的成员函数,而是算法的一部分,通常在<algorithm>头文件中定义



6)insert

cpp 复制代码
iterator insert(iterator position, const value_type& val);
void insert(iterator position, size_type n, const value_type& val);
template <class InputIterator>
void insert(iterator position, InputIterator first, InputIterator last);

position指定的位置插入一个新元素val,或者插入n个值为val的元素,或者插入由迭代器范围[first, last)指定的元素序列

7)erase

cpp 复制代码
iterator erase(iterator position);
iterator erase(iterator first, iterator last);

删除由position指定的单个元素,或者删除由迭代器范围[first, last)指定的元素序列
注: list的insert和erase会不会造成迭代器失效的问题?

listinserterase 操作不会导致迭代器失效

解释:

  • insert:在 list 中插入元素时,由于 list 是由双向链表实现的插入操作会创建新的节点并将其链接到链表中,不会影响到其他节点的内存位置,因此所有迭代器(包括指向插入点之前、之后和插入点本身的迭代器)仍然有效。
  • erase:当从 list 中删除元素时,只会移除特定的节点并重新链接其前后的节点,而不会影响其他节点的位置。因此,除了被擦除元素的那个迭代器外,其他迭代器仍然有效。

简单来说:

  • insert:非侵入式节点插入,迭代器保持有效。
  • erase:节点移除,仅影响目标迭代器,其他迭代器保持有效

8)swap

cpp 复制代码
void swap(list& other);

交换两个list容器的内容,这个操作非常高效,因为它只交换内部数据结构,而不需要交换实际的元素



9)assign

cpp 复制代码
void assign(size_t n, const value_type& val);
template <class InputIterator>
void assign(InputIterator first, InputIterator last);

list的内容替换为n个值为val的元素,或者替换为由迭代器范围[first, last)指定的元素序列

10)clear

cpp 复制代码
void clear();

删除list中的所有元素,使容器变为空



list顺序修改接口

cpp 复制代码
void reverse();

reverse 函数会反转 list 中元素的顺序。也就是说,列表中的第一个元素会变成最后一个元素,第二个元素会变成倒数第二个元素,以此类推。

这个操作会就地(in-place)进行,不需要额外的存储空间。调用这个函数后,列表的迭代器、引用和指针仍然有效,但它们现在会指向反转后的列表中的不同元素




***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

"优秀的人,在优秀的时间、优秀的地方,在干优秀的事"。

我是白子寰 ,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。

你的点赞和关注是我持续写作的动力!!!

好了划走吧。

相关推荐
zmd-zk2 分钟前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
好奇的菜鸟6 分钟前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.015 分钟前
Go语言进阶&依赖管理
开发语言·后端·golang
花海少爷17 分钟前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
手握风云-18 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟37 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生43 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow1 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull1 小时前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
怀澈1221 小时前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++