C++ STL容器之forward_list - Go语言中文社区

C++ STL容器之forward_list


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 - 元素的类型。

  1. 加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型是完整类型并满足可擦除 (Erasable)
    的要求,但许多成员函数附带了更严格的要求。 (C++17 前)
  2. 加诸元素的要求依赖于容器上进行的实际操作。泛言之,要求元素类型满足可擦除 (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;
}

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_41855420/article/details/89765022
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢