文章目录
-
- 测试环境
- forward_list介绍
- 头文件
- 模块类定义
- 对象构造
- 初始化
- 元素访问
- 元素插入和删除
- 容器大小
- 迭代器
- 其他函数
测试环境
系统:ubuntu 22.04.2 LTS 64位
gcc版本:11.3.0
编辑器:vsCode 1.76.2
forward_list介绍
- 序列式容器
- 不支持随机访问。
- 不支持反向迭代器。
- 元素存储在不同且不相关的存储单元中。
- 频繁插入、提取、移动和删除元素时效率较高。
- 单项链表(list是双向链表)。
头文件
#include
模块类定义
_Tp:表示存储的元素数据类型
_Alloc:表示所存储分配器的类型,负责元素内存的分配和释放。可选参数,一般不使用。
template<typename _Tp, typename _Alloc = allocator<_Tp>>
class forward_list{}
对象构造
std::forward_list<int> fwLstInt1;
std::forward_list<int> fwLstInt2(10);
std::forward_list<int> fwLstInt3(10,6);
std::forward_list<int> fwLstInt4(fwLstInt3);
std::forward_list<int> fwLstInt5(fwLstInt3.begin(),fwLstInt3.end());
std::forward_list<int> fwLstInt6(std::move(fwLstInt5));
std::forward_list<int> fwLstInt7({1,2,3,4,5,6,7,8,9,0});
初始化
函数 |
返回值 |
功能 |
assign() |
无 |
情况链表中的元素并用指定数据进行赋值 |
fwLstInt1 = {1,2,3,4,5};
fwLstInt1.assign(fwLstInt6.cbegin(), fwLstInt6.cend());
fwLstInt1.assign(5,8);
fwLstInt1.assign({8,7,6,5,4,3,2,1});
元素访问
函数名 |
返回值 |
功能 |
front() |
首元素的引用 |
获取首元素,链表为空时返回值不确定 |
std::cout << lstInt1.front() << std::endl;
元素插入和删除
函数 |
返回值 |
功能 |
clear() |
无 |
清空所有元素 |
erase_after() |
迭代器 |
清除指定位置之后的一个元素或删除通过迭代器指定范围内的元素 |
emplace_after() |
迭代器 |
在指定位置移动构造一个新元素 |
emplace_front() |
无 |
在链表头直接移动构造一个新元素 |
insert_after() |
迭代器或无 |
1)在指定位置插入1个元素。2)在指定位置插入指定数量的相同元素。3)通过指定迭代器范围在指定位置插入数据.4)在指定位置使用初始化列表插入元素 |
pop_front() |
无 |
删除链表头元素 |
push_front() |
无 |
链表头插入元素 |
remove() |
无 |
删除与指定值相同的所有元素 |
remove_if() |
无 |
按用户自定义条件删除元素 |
std::forward_list<int> fwLstTest1({1,2,4,5});
fwLstTest1.push_front(88);
int iValue2 = 34;
fwLstTest1.push_front(std::move(iValue2));
fwLstInt1.emplace_front(10);
fwLstTest1.erase_after(++fwLstTest1.begin());
fwLstTest1.erase_after(fwLstTest1.begin(), ++fwLstTest1.begin());
fwLstTest1.insert_after(++fwLstTest1.begin(),66);
fwLstTest1.insert_after(fwLstTest1.begin(),3,8);
fwLstTest1.insert_after(fwLstTest1.begin(), fwLstInt3.begin(), ++fwLstInt3.begin());
fwLstTest1.insert_after(fwLstTest1.begin(), {1,2,3});
int iValue = 33;
fwLstTest1.insert_after(fwLstTest1.begin(), std::move(iValue));
fwLstTest1.pop_front();
fwLstTest1.erase_after(fwLstTest1.begin());
auto itr2 = ++fwLstTest1.begin();
fwLstTest1.erase_after(fwLstTest1.begin(), ++itr2);
fwLstTest1.remove(8);
class delThanTen
{
public:
bool operator()(int &element)
{
return element > 10;
}
};
fwLstTest1.remove_if(delThanTen());
fwLstTest1.clear();
容器大小
函数 |
返回值 |
功能 |
empty() |
bool |
判断链表是否为空,为空返回true,否则返回false |
max_size() |
std::size_t |
返回容器的最大容量 |
reverse() |
无 |
反转链表中的元素排列顺序 |
resize() |
无 |
重新指定容器可以容纳的元素数量,新大小大于原本大小时超出部分可使用指定元素填充(在链表首填充),如果新大小小于指定大小时会删除容器原本链表首的数据。 |
fwLstTest1 = {1,2,3,4,5,6,7};
std::cout << std::boolalpha << fwLstTest1.empty() << std::endl;
fwLstTest1.resize(30);
std::cout << fwLstTest1.max_size() << std::endl;
fwLstTest1.reverse();
迭代器
类型 |
功能 |
iterator |
正向访问迭代器。从前向后访问元素,可以读取也可以修改 |
const_iterator |
常量正向访问迭代器。从前向后访问元素,只能读取不能修改 |
函数 |
返回值 |
功能 |
before_begin() |
正向访问迭代器 |
返回指向forward_list对象首元素的前一个位置 |
cbefore_begin() |
常量正向访问迭代器 |
返回指向forward_list对象首元素的前一个位置 |
begin() |
正向访问迭代器 |
返回指向forward_list对象首元素所在位置的迭代器 |
end() |
正向访问迭代器 |
返回指向forward_list对象末尾元素的下一个位置的迭代器 |
cbegin() |
常量正向访问迭代器 |
返回指向forward_list对象首元素所在位置的常量迭代器 |
cend() |
常量正向访问迭代器 |
返回指向forward_list对象末尾元素的下一个位置的迭代器 |
注:使用在指定位置之后插入元素接口时,如在链表头插入元素时使用before_begin(),使用begin(),会在第二个位置插入元素。因为before_begin()指向的是链表头。单练表只支持自增(++)操作。
std::forward_list<int> fwLstTest4 = {10,11,12,13,14,15,16,17,18,19};
std::forward_list<int>::iterator itr;
for (itr = fwLstTest4.begin(); itr != fwLstTest4.end(); itr++)
{
*itr += 10;
std::cout << *itr << " ";
}
std::cout<<std::endl;
std::forward_list<int>::const_iterator cItr;
for (cItr = fwLstTest4.begin(); cItr != fwLstTest4.end(); cItr++)
{
std::cout << *cItr << " ";
}
std::cout<<std::endl;
其他函数
函数名 |
返回值 |
功能 |
merge() |
无 |
合并两个链表,并按指定规则排序 |
sort() |
无 |
按升序或用户指定的顺序排列元素 |
swap() |
无 |
交换两个容器的元素 |
splice_after() |
无 |
将一个链表中的元素添加到另一个链表中,并将原链表中的元素删除 |
unique() |
无 |
删除相邻的重复元素,或者按指定规则删除元素 |
std::forward_list<int> fwLstSwap1 = {1,2,3,4,5};
std::forward_list<int> fwLstSwap2 = {5,4,3,2,1};
fwLstSwap1.swap(fwLstSwap2);
std::swap(fwLstSwap1,fwLstSwap2);
fwLstSwap1 = {1,2,3,4,5};
fwLstSwap2 = {1,2,3,4,5};
fwLstSwap1.merge(fwLstSwap2);
fwLstSwap1 = {5,4,3,2,1};
fwLstSwap2 = {5,4,3,2,1};
fwLstSwap1.merge(fwLstSwap2,std::greater<int>());
fwLstSwap1.sort(std::greater<int>());
std::forward_list<int> fwLstSplice1 = {5,4,3,2,1};
std::forward_list<int> fwLstSplice2 = {5,4,3,2,1};
fwLstSplice1.splice_after(fwLstSplice1.begin(), fwLstSplice2, ++fwLstSplice2.before_begin());
fwLstSplice1.splice_after(fwLstSplice1.before_begin(), fwLstSplice2, fwLstSplice2.begin(), fwLstSplice2.end());
fwLstSplice2.splice_after(fwLstSplice2.before_begin(), fwLstSplice1);
fwLstTest1 = {1,1,2,2,3,3,5,3,5};
fwLstTest1.unique();
std::not_equal_to<int> compare;
fwLstTest1.unique(compare);