list
- 简介
上篇博客简单解析了vector的应用,这篇则要对list进行解析。
list与vector一样,都是C++标准函数库的内容,其两者可以说都是容器。
API中对与list的定义如下:
Lists are a kind of sequence container. As such, their elements are ordered following a linear sequence.
翻译如下:列表是一种序列容器。 因此,它们的元素按照线性顺序排列。
,不同于其他链表的是,list是一个序列容器,即其可包含任意类型的数据。
list中提供的成员函数与vector类似,不过list提供了对表于首元素的操作push_front、pop_front,这是vector不具备的。
来看一下list中的成员函数:
从上图中,可以看到对于list中数据的操作,包含有迭代器(iterator),数据修改,容量获取等等。下面我就针对list的使用以及上面的部分成员函数进行简单的解析。
- 2.应用
- list与vector一样,在应用时,都要引入头文件,如果要应用list的话,就需要引入
#include<list>
同时,list属于std命名空间,因此运用是需要进行命名限定,以下即为限定方式:
std::list<type> test;
using namespace std;
接下来,我简单介绍一下list其内部接口的作用:
begin():返回list首部元素迭代器
end():返回list尾部元素下一个位置的迭代器
rbegin():反向迭代器,返回的是list尾部元素的迭代器
rend():反向迭代器,返回的是list首部元素前一个位置的迭代器
empty():判断list是否为空
size():获取list中的数据容量
resize():更新list的内存容量,并且改变其内的数据容量
reverse():逆置list中的元素
front():返回list的首元素
back():返回list的尾元素
push_front():头插元素
pop_front():删除头元素
push_back():尾插元素
pop_back():删除尾部元素
insert():指定位置插入元素
erase():指定删除元素
swap():交换list中数据
clear():清空list中的数据
assign():给list赋值
sort():给list中的数据进行排序
splice():将两个list进行合并
unique():删除list中重复出现的元素
以下为测试代码:
#include<iostream>
#include<list>
using namespace std;
void print(const list<int> l)
{
list<int>::const_iterator it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void EraseTest(list<int> l)
{
//删除单个节点erase
list<int>::iterator it = l.begin();
while (it != l.end())
{
if (*it % 2 == 0)
it = l.erase(it);//迭代器失效,需要接受返回值
else
{
it++;
}
}
print(l);
}
void ResizeTest(list<int>& l)
{
l.resize(5);
cout << "链表中的字符数量:" << l.size() << endl;
print(l);
//resize 增容时还会用缺省值进行初始化
l.resize(10);
cout << "链表中的字符数量:"<< l.size() << endl;
print(l);
//resize增容之后,再进行尾插时会直接连接在最后面,因为前面的已经被resize进行了初始化
for (size_t i = 1; i < 4; i++)
{
l.push_back(i);
}
cout << "链表中的字符数量:" << l.size() << endl;
print(l);
l.resize(15, 100);
cout << "链表中的字符数量:" << l.size() << endl;
print(l);
}
void InsertTest(list<int>& l)
{
list<int>::iterator it = l.begin();
l.insert(it, -1);
print(l);
l.insert(it, 3,-2);
print(l);
}
void listTest()
{
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
l1.push_back(5);
l1.push_back(6);
cout << "链表中的字符数量:" << l1.size() << endl;
print(l1);
list<int>::const_iterator it = l1.begin();
EraseTest(l1);
ResizeTest(l1);
cout << l1.empty() << endl;
cout << l1.front() << endl;
cout << l1.back() << endl;
l1.push_front(0);
print(l1);
cout << "链表中的字符数量:" << l1.size() << endl;
l1.pop_back();
cout << "链表中的字符数量:" << l1.size() << endl;
l1.pop_front();
cout << "链表中的字符数量:" << l1.size() << endl;
InsertTest(l1);
l1.sort();
print(l1);
}
程序运行结果如下所示: