概述
C++ forward_list 容器
定义于头文件 <forward_list>
,申明为 template< class T, class Allocator = std::allocator<T>> class forward_list;
std::forward_list 是支持从容器中的任何位置快速插入和移除元素的容器。不支持快速随机访问。它实现为单链表,且实质上与其在 C 中实现相比无任何开销。与 std::list 相比,此容器提在不需要双向迭代时提供更有效地利用空间的存储。
在链表内或跨数个链表添加、移除和移动元素,不会非法化当前指代链表中其他元素的迭代器。然而,在从链表移除元素(通过 erase_after )时,指代对应元素的迭代器或引用会被非法化。
std::forward_list 满足容器 (Container) (除了 operator== 的复杂度始终为线性和 size 函数)、具分配器容器 (AllocatorAwareContainer) 和顺序容器 (SequenceContainer) 的要求。
模板形参
T - 元素的类型。
- 加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型是完整类型并满足可擦除 (Erasable)
的要求,但许多成员函数附带了更严格的要求。 (C++17 前) - 加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型满足可擦除 (Erasable)
的要求,但许多成员函数附带了更严格的要求。若分配器满足分配器完整性要求,则容器(但非其成员)能以不完整元素类型实例化。 (C++17
起)
Allocator - 用于获取/释放内存及构造/析构内存中元素的分配器。类型必须满足分配器 (Allocator) 的要求。若 Allocator::value_type 与 T 不同则行为未定义。
成员类型
成员类型 | 定义 |
---|---|
value_type | T |
allocator_type | Allocator |
size_type | 无符号整数类型(通常是 std::size_t ) |
difference_type | 有符号整数类型(通常是 std::ptrdiff_t ) |
reference | value_type& |
const_reference | const value_type& |
pointer | std::allocator_traits::pointer |
const_pointer | std::allocator_traits::const_pointer |
iterator | 向前迭代器 (LegacyForwardIterator) |
const_iterator | 常向前迭代器 |
成员函数
(构造函数) | 构造 forward_list (公开成员函数) |
(析构函数) | 析构 forward_list (公开成员函数) |
operator= | 赋值给容器 (公开成员函数) |
assign | 将值赋给容器 (公开成员函数) |
get_allocator | 返回相关的分配器 (公开成员函数) |
元素访问
front | 访问第一个元素 (公开成员函数) |
示例:
#include<iostream>
#include<forward_list>
using namespace std;
int main() {
forward_list<int> myForward_list = { 10, 20, 80, 70, 30};
cout << "元素表列:";
for (auto &num : myForward_list) {
cout << num << " ";
}
cout << endl;
cout << "myForward_list.front() = " << myForward_list.front() << endl;
return 0;
}
迭代器
before_begin、cbefore_begin | 返回指向第一个元素之前迭代器 (公开成员函数) |
begin、cbegin | 返回指向容器第一个元素的迭代器 (公开成员函数) |
end、cend | 返回指向容器尾端的迭代器 (公开成员函数) |
示例:
begin与cbegin的区别是,begin迭代器可以修改指向的元素,而cbegin是 const begin的缩写,不能修改begin指向的元素
#include<iostream>
#include<forward_list>
using namespace std;
int main() {
forward_list<int> myForward_list = { 10, 20, 80, 70, 30 };
cout << "正向迭代器遍历容器:";
for (auto it = myForward_list.begin(); it != myForward_list.end(); ++it) {
cout << *it << " ";
}
cout << endl;
//正向常迭代器测试
cout << "正向常迭代器遍历容器:";
for (auto it = myForward_list.cbegin(); it != myForward_list.cend(); ++it) {
cout << *it << " ";
}
cout << endl;
return 0;
}
容量
empty | 检查容器是否为空 (公开成员函数) |
max_size | 返回可容纳的最大元素数 (公开成员函数) |
#include<iostream>
#include<forward_list>
using namespace std;
int main() {
forward_list<int> myForward_list = { 10, 20, 80, 70, 30 };
cout << "元素表列:";
for (auto &num : myForward_list) {
cout << num << " ";
}
cout << endl;
cout << "myForward_list.empty() = " << myForward_list.empty() << endl;
cout << "myForward_list.max_size() = " << myForward_list.max_size() << endl;
return 0;
}
修改器
clear | 清除内容 (公开成员函数) |
insert_after | 在某个元素后插入新元素 (公开成员函数) |
emplace_after | 在元素后原位构造元素 (公开成员函数) |
erase_after | 擦除元素后的元素 (公开成员函数) |
push_front | 插入元素到容器起始 (公开成员函数) |
emplace_front | 在容器头部就地构造元素 (公开成员函数) |
pop_front | 移除首元素 (公开成员函数) |
resize | 改变容器中可存储元素的个数 (公开成员函数) |
swap | 交换内容 (公开成员函数) |
示例1:
#include<iostream>
#include<forward_list>
using namespace std;
int main() {
forward_list<int> myForward_list = { 1,2,3,4,5 };//自动调整大小为5
cout << "元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//在容器的首端放入10
myForward_list.push_front(10);
cout << "在首端放入10后,元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//去除容器的首端值
myForward_list.pop_front();
cout << "去除首端后,元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//在容器的首端后插入10
myForward_list.insert_after(myForward_list.begin(), 10);
cout << "在容器首端后插入10,元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//移除容器的首端后的一个元素
myForward_list.erase_after(myForward_list.begin());
cout << "在移除容器的首端后的一个元素,元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//重新修改容器的大小为3
myForward_list.resize(3);
cout << "重新修改容器的大小为3,元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//清空容器
myForward_list.clear();
cout << "清空容器,元素列表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
return 0;
}
示例2:
#include<iostream>
#include<forward_list>
using namespace std;
int main() {
forward_list<int> myForward_listOne = { 1,2,3,4,5 };//自动调整大小为5
forward_list<int> myForward_listTw0 = { 6,7,8,9,0 };//自动调整大小为5
cout << "交换前两个forward_list:" << endl;
cout << "listOne元素序列:";
for (auto &num : myForward_listOne) {
cout << num << " ";
}
cout << endl;
cout << "listTwo元素序列:";
for (auto &num : myForward_listTw0) {
cout << num << " ";
}
cout << endl;
myForward_listOne.swap(myForward_listTw0);//交换两个list
cout << "交换后两个个forward_list:" << endl;
cout << "listOne元素序列:";
for (auto &num : myForward_listOne) {
cout << num << " ";
}
cout << endl;
cout << "listTwo元素序列:";
for (auto &num : myForward_listTw0) {
cout << num << " ";
}
cout << endl;
return 0;
}
操作
merge | 合并二个已排序列表 (公开成员函数) |
splice_after | 从另一 forward_list 移动元素 (公开成员函数) |
remove、remove_if | 移除满足特定标准的元素 (公开成员函数) |
reverse | 将该链表的所有元素的顺序反转 (公开成员函数) |
unique | 删除连续的重复元素 (公开成员函数) |
sort | 对元素进行排序 (公开成员函数) |
测试1:
#include<iostream>
#include<forward_list>
#include<algorithm>
using namespace std;
//按照升序排序
bool myGreater(const int &first, const int &second) {
return first < second;
}
//按照降序排序
bool myLess(const int &first, const int &second) {
return first > second;
}
int main() {
forward_list<int> myForward_listOne = { 20, 40, 10, 10, 60, 30 };//自动调整大小为6
forward_list<int> myForward_listTwo = { 15, 35, 5, 65, 25 };//自动调整大小为5
cout << "升序排序之前:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_listOne) {
cout << num << " ";
}
cout << endl;
//升序排序
myForward_listOne.sort(myGreater);
cout << "升序排序之后:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_listOne) {
cout << num << " ";
}
cout << endl << endl;
cout << "降序排序之前:" << endl;
cout << "listTwo元素表:";
for (auto num : myForward_listTwo) {
cout << num << " ";
}
cout << endl;
//降序排序
myForward_listTwo.sort(myLess);
cout << "降序排序之后:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_listTwo) {
cout << num << " ";
}
cout << endl << endl;
//反转链表
cout << "反转之前:" << endl;
cout << "listTwo元素表:";
for (auto num : myForward_listTwo) {
cout << num << " ";
}
cout << endl;
myForward_listTwo.reverse();//反转链表
cout << "反转之后:" << endl;
cout << "listTwo元素表:";
for (auto num : myForward_listTwo) {
cout << num << " ";
}
cout << endl << endl;
//合并链表
myForward_listOne.merge(myForward_listTwo);
cout << "合并listOne、listTwo之后:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_listOne) {
cout << num << " ";
}
cout << endl;
cout << "listTwo元素表:";
for (auto num : myForward_listTwo) {
cout << num << " ";
}
cout << endl << endl;
return 0;
}
示例2:
#include<iostream>
#include<forward_list>
using namespace std;
int main() {
forward_list<int> myForward_list = { 5, 8, 20, 30, 30, 40, 10, 10, 10, 60, 30, 10 };
cout << "删除连续重复的元素之前:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl;
//删除连续重复的元素
myForward_list.unique();
cout << "删除连续重复的元素之后:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl << endl;
//移除元素10
myForward_list.remove(10);
cout << "删除所有的 10 之后:" << endl;
cout << "listOne元素表:";
for (auto num : myForward_list) {
cout << num << " ";
}
cout << endl << endl;
return 0;
}
最后
以上就是迷你砖头为你收集整理的C++ STL容器之forward_list的全部内容,希望文章能够帮你解决C++ STL容器之forward_list所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复