01 std::list介绍
std::list是C++标准库中的一个模板类,用于实现双向链表。双向链表是一种线性数据结构,其中的每个元素都包含两个链接,一个指向前一个元素,另一个指向下一个元素。
std::list的使用与其他标准容器如std::vector、std::deque 或 std::forward_list类似,但有一些关键的差异。
02 定义
以下示例分别定义存储不同数据元素的双向链表容器对象。
// 包含头文件。
#include <list>
// 自定义类。
class MyClass;
// 定义存储int整数双向链表容器对象。
std::list<int> lis_int_values;
// 定义存储float浮点数双向链表容器对象。
std::list<float> lis_float_values;
// 定义存储MyClass类双向链表容器对象。
std::list<MyClass> lis_class_values;
03 添加元素
-
将元素添加到容器开头:
push_front()和emplace_front()函数用于将元素添加到容器的开头。
// 将元素添加到容器开头示例。
lis_int_values.push_front(100);
lis_int_values.push_front(200);
lis_int_values.emplace_front(300);
-
将元素添加到容器尾部:
push_back()和emplace_back()函数用于将元素添加到容器的尾部。
// 将元素添加到容器尾部示例。
lis_int_values.push_back(1);
lis_int_values.push_back(2);
lis_int_values.emplace_back(30);
-
将元素插入到指定位置:
insert()和emplace()函数用于将元素插入到容器的指定位置。
std::list::begin() 表示开头位置。
std::list::cbegin() 表示开头位置。
std::list::end() 表示尾部位置。
std::list::cend() 表示尾部位置。
// 将元素添加到容器开头位置示例。
lis_int_values.insert(lis_int_values.cbegin(), 100);
lis_int_values.emplace(lis_int_values.cbegin(), 200);
04 删除元素
-
删除容器开头元素:
pop_front()函数用于删除容器开头元素。
// 删除开头元素示例。
lis_int_values.pop_front();
-
删除容器尾部元素:
pop_back()函数用于删除容器尾部元素。
// 删除容器尾部元素示例。
lis_int_values.pop_back();
-
通过remove函数删除指定元素:
// 删除所有元素值等于100元素。
lis_int_values.remove(100);
-
通过迭代器删除指定元素:
示例说明:遍历动态数组,找出值等于100的元素并删除。
for (auto iter = lis_int_values.begin(); iter != lis_int_values.end(); )
{
const int v = *iter;
if (100 == v)
{
// 删除值为100的元素。
iter = lis_int_values.erase(iter);
}
else
{
// 迭代器移到下一个元素。
++iter;
}
}
// 删除第一个元素示例。
lis_int_values.erase(lis_int_values.cbegin());
05 访问和修改元素
-
访问和修改开头元素:
front()函数用于访问容器开头元素。如果容器为空,函数会抛出异常。
// 访问容器开头元素示例。
int v = lis_int_values.front();
// 修改容器开头元素值示例。
lis_int_values.front() = 1000;
-
访问和修改尾部元素:
back()函数用于访问容器尾部元素。如果容器为空,函数会抛出异常。
// 访问容器尾部元素示例。
int v = lis_int_values.back();
// 修改容器尾部元素值示例。
lis_int_values.back() = 20;
-
修改指定元素值:
通过迭代器遍历容器,修改指定元素值。
/**** 例子: ****/
// 遍历容器,找到值等于2元素,并修改为200。
for (auto iter = lis_int_values.begin(); iter!=lis_int_values.end(); ++iter)
{
// 元素值
int v = *iter;
if (2 == v) // 元素值等于2
{
// 修改元素值
*iter = 200;
}
}
06 遍历元素
#include <iostream>
// 遍历容器所有元素示例。
for (int v : lis_int_values)
{
std::cout << "v = " << v << std::endl;
}
// 删除所有元素值等于100元素。
lis_int_values.remove(100);
-
通过迭代器删除指定元素:
示例说明:遍历容器,找出值等于100的元素并删除。
for (auto iter = lis_int_values.begin(); iter != lis_int_values.end(); )
{
const int v = *iter;
if (100 == v)
{
// 删除值为100的元素。
iter = lis_int_values.erase(iter);
}
else
{
// 迭代器移到下一个元素。
++iter;
}
}
07 元素排序
-
默认排序:
// 默认排序(升序)示例。
lis_int_values.sort();
-
使用lambda表达式自定义排序:
// 使用lambda表达式实现降序示例。
lis_int_values.sort([](int a, int b)
{
return a > b;
}
);
08 附录:完整源码
关注公众号下载本示例完整源码(11_std_list_example.zip)。
-【End】-
#想了解更多精彩内容,关注下方公众号,还有示例源码、开发工具免费下载。
喜欢本文章,记得点赞、分享、关注哦~