💗个人主页💗
⭐个人专栏------C++学习⭐
💫点击关注🤩一起学习C语言💯💫
目录
[1. list基本介绍](#1. list基本介绍)
[2. list构造函数](#2. list构造函数)
[3. list迭代器](#3. list迭代器)
[4. list容量](#4. list容量)
[5. list的修改操作](#5. list的修改操作)
[6. list排序](#6. list排序)
导读
今天我们来正式学习list,了解它的一些基本使用方法。我们在之前C语言的数据结构部分,有讲过单链表和双向循环链表,有兴趣的小伙伴可以点进专栏看一下。
1. list基本介绍
C++中的list
是一个双向链表容器。它允许在任意位置进行快速插入和删除操作,并且能够在常量时间内访问任意元素。
- list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。
- list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。
- 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。
- 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)
2. list构造函数
在C++中,可以使用不同的构造函数来创建list
对象。
1. 默认构造函数:
使用默认构造函数创建一个空的list
对象。
cpp
std::list<T> myList;
2. 复制构造函数:
使用另一个list
对象otherList
创建一个新的list
对象,并复制所有元素。
cpp
std::list<T> myList(otherList);
3. 范围构造函数:
使用指定范围内的元素创建一个新的list
对象。first
和last
是指向范围内第一个元素和最后一个元素的迭代器。
cpp
std::list<T> myList(first, last);
4. 初始化列表构造函数:
使用初始化列表中的值来创建一个新的list
对象。
cpp
std::list<T> myList = {val1, val2, val3, ...};
示例:
cpp
int main()
{
// 默认构造函数
list<int> myList1;
// 复制构造函数
list<int> myList2(myList1);
// 范围构造函数
list<int> myList3(myList1.begin(), myList1.end());
// 初始化列表构造函数
list<int> myList4 = { 1, 2, 3, 4, 5 };
// 遍历list并打印所有元素
for (int num : myList4) {
cout << num << " ";
}
cout << endl;
return 0;
}
3. list迭代器
list
容器提供了双向迭代器(bidirectional iterators),可以用于遍历和操作容器中的元素。list
的迭代器支持前进(++)和后退(--)操作,并且可以跳转到任意位置。
以下是一些常用的list
迭代器操作:
begin()
:返回指向第一个元素的迭代器。end()
:返回指向最后一个元素之后位置的迭代器。rbegin()
:返回指向最后一个元素的逆向迭代器。rend()
:返回指向第一个元素之前位置的逆向迭代器。
示例:
cpp
int main()
{
list<int> myList = { 1, 2, 3, 4, 5 };
// 正向迭代器遍历list
cout << "正向遍历list: ";
list<int>::iterator itr;
for (itr = myList.begin(); itr != myList.end(); ++itr)
{
cout << *itr << " ";
}
cout << endl;
// 逆向迭代器遍历list
cout << "逆向遍历list: ";
list<int>::reverse_iterator ritr;
for (ritr = myList.rbegin(); ritr != myList.rend(); ++ritr)
{
cout << *ritr << " ";
}
cout << endl;
return 0;
}
4. list容量
使用size()
函数来获取容器的大小。
empty()
函数返回一个bool
类型的值,如果容器为空,则返回true
;否则返回false
。
cpp
int main()
{
std::list<int> myList = { 1, 2, 3 };
cout << "容器大小:" << size(myList) << endl;
if (myList.empty())
{
cout << "容器为空" << endl;
}
else
{
cout << "容器不为空" << endl;
}
myList.clear();
cout << "容器大小:" << size(myList) << endl;
if (myList.empty())
{
cout << "容器为空" << endl;
}
else
{
cout << "容器不为空" << endl;
}
return 0;
}
5. list的修改操作
list
是一种双向链表容器,提供了多种修改容器的操作函数。下面是一些常见的list
的修改操作函数:
1. 添加元素:
- 使用
push_back(element)
函数将元素添加到列表的末尾。- 使用
push_front(element)
函数将元素添加到列表的开头。- 使用
insert(iterator, element)
函数在指定的迭代器位置之前插入元素。
2. 删除元素:
- 使用
pop_back()
函数删除列表的最后一个元素。- 使用
pop_front()
函数删除列表的第一个元素。- 使用
erase(iterator)
函数删除指定迭代器位置的元素。- 使用
erase(start_iterator, end_iterator)
函数删除指定范围内的元素。
3. 修改元素:
- 使用迭代器操作符
*
来直接修改列表中的元素。
cpp
int main()
{
list<int> my_list = { 1, 2, 3 };
// 添加元素
my_list.push_back(4);
my_list.push_front(0);
auto it = my_list.insert(++my_list.begin(), 5);
for (auto e : my_list)
{
cout << e << " ";
}
cout << endl;
// 删除元素
my_list.pop_back();
my_list.pop_front();
my_list.erase(it);
for (auto e : my_list)
{
cout << e << " ";
}
cout << endl;
// 修改元素
*++my_list.begin() = 6;
// 打印列表元素
for (const auto& elem : my_list)
{
cout << elem << " ";
}
cout << endl;
return 0;
}
6. list排序
在C++中,可以使用list
容器的sort()
成员函数对列表进行排序。sort()
函数会根据元素的默认比较函数(operator<
)来进行排序。如果列表中的元素是自定义类型,可以通过在类中重载小于操作符(operator<
)来定义自定义的比较方式。
cpp
int main()
{
list<int> my_list = { 5, 2, 8, 1, 4 };
// 对列表进行升序排序
my_list.sort();
// 打印排序后的列表
for (const auto& elem : my_list)
{
cout << elem << " ";
}
cout << endl;
// 对列表进行降序排序
my_list.sort(greater<int>());
for (const auto& elem : my_list)
{
cout << elem << " ";
}
cout << endl;
return 0;
}