C++之STL的forward_list容器

forward_list

forward_list的实现方式

forward_list是单向链表容器,每个元素一个节点

forward_list的用法

#include 
#include 
using namespace std;

int main()
{
	forward_list<int> fl;

	cout << "fl的size为:" << distance(fl.begin(), fl.end()) << endl;

	fl.push_front(2);	//前面插入元素
	//fl.pop_front();	//后面删除元素	//使用这个一定要确保容器不为空
	fl.push_front(6);
	//fl.pop_front();
	cout << "fl的size为:" << distance(fl.begin(), fl.end()) << endl;
	cout << "fl的max_size为:" << fl.max_size() << endl << endl;
	
	cout << "1容器的元素为:" << endl;
	for(auto value : fl ){
		cout << value << " ";
	}
	cout << endl << endl;
	
	cout << "fl的最前面元素是:" << fl.front() << endl << endl;
	
	fl.resize(5, 66);
	cout << "2容器的元素为:" << endl;
	for(auto value : fl ){
		cout << value << " ";
	}
	cout << endl;
   return 0;
}

代码的话就写这么多,其他用法如下

forward_list fl(10);这样初始化,代表10个元素为默认值
forward_list fl(10, 666);这样初始化,代表10个元素都为666
forward_list fl(fl_);拷贝链表数据
front();第一个元素
empty()判断容器是否为空的方法
emplace_back()和emplace_front();这两个方法和push_back差不多,但是这个方法可以避免不必要的拷贝和移动
swap();交换两个容器的元素 //fl.swap(fl_);
assign(n, value);使用n个value代替旧有元素
auto it = find(fl.begin(), fl.end(), value);可以寻找元素是否存在,(distance(fl.begin(), it))返回fl.begin()到it的距离
merge(fl_);当前链表和另一个已排序的链表合并为一个排序后的链表。 fl_容器变空链表。fl.merge(fl_);
unique();删除链表中相邻的重复元素,只保留一个 fl.unique();
splice_after(iterator pos, fl_); 将fl_链表的所有元素转移到当前链表位置 fl.splice_after(it, fl_); fl_容器变空链表
splice_after用法二:splice_after(iterator pos, fl_, iterator value); fl.splice_after(it, fl_, fl_.begin());
remove(value);删除链表中所有值为value的元素; fl.remove(value);
replace(iterator begin, iterator end, old_value, new_value);将链表中所有等于old_value的元素替换为new_value ,比如这样replace(fl.begin(), fl.end(), 2, 20);
count(); count(fl.begin(), fl.end(), value);
sort(); fl.sort(); //使用自己的sort()方法,不能使用std::sort()
insert_after(iterator pos, value)
insert_after(iterator pos, n, value)
insert_after(iterator pos, iterator first, iterator last)
erase_after(iterator pos)
erase_after(iterator first, iterator last)
remove_if(); fl.remove_if(谓词);
reverse(); fl.reverse();
partition()容器里符合条件的移到前面,不保持相对顺序

代码如下:

#include 
#include 
#include 
#include 
using namespace std;

const bool PRINT = true;
const int TESTVALUE = 111;

bool RemoveIf(int x){
	return x % 2 == 0;	
}

bool isEven(int x){
	return x % 2 == 0;	
}

int main()
{
	//forward_list fl(10);这样初始化,代表10个元素为默认值
	if (PRINT || TESTVALUE == 1) {
		cout << "TESTVALUE = 1" << endl;
		forward_list<int> fl(10);
		for (auto value : fl) {
			cout << value << "\t";
		}
		cout << endl << endl;
	}

	//forward_list fl(10, 666);这样初始化,代表10个元素都为666
	if (PRINT || TESTVALUE == 2) {
		cout << "TESTVALUE = 2" << endl;
		forward_list<int> fl(10, 666);
		for (auto value : fl) {
			cout << value << "\t";
		}
		cout << endl << endl;
	}

	//forward_list fl(fl_);拷贝链表数据
	if (PRINT || TESTVALUE == 3) {
		cout << "TESTVALUE = 3" << endl;
		forward_list<int> fl_(10, 66);
		forward_list<int> fl(fl_);
		for (auto value : fl) {
			cout << value << "\t";
		}
		cout << endl << endl;
	}

	//front();第一个元素
	//链表为空的话使用front()出现未定义的行为,所以用之前需要使用empty()判断一下
	if (PRINT || TESTVALUE == 4) {
		cout << "TESTVALUE = 4" << endl;
		forward_list<int> fl = { 3, 6, 9 };
		cout << "fl的front元素为:" << fl.front() << endl << endl;
	}
	//empty()判断容器是否为空的方法
	if (PRINT || TESTVALUE == 5) {
		cout << "TESTVALUE = 5" << endl;
		forward_list<int> fl;
		if (fl.empty()) {
			cout << "fl容器为空" << endl;
		}
		else {
			cout << "fl容器不为空" << endl;
		}
		cout << endl;
	}
	//emplace_front();这个方法和push_front差不多,但是这个方法可以避免不必要的拷贝和移动
	if (PRINT || TESTVALUE == 6) {
		cout << "TESTVALUE = 6" << endl;
		forward_list<string> fl;
		string str_1 = "hello";
		fl.push_front(str_1);		//这里发生了一次拷贝
		fl.push_front("world");	//这里发生了一次移动

		fl.emplace_front("hello, world!");	//这里是直接在容器里构造

		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//swap();交换两个容器的元素		//fl.swap(fl_);
	if (PRINT || TESTVALUE == 8) {
		cout << "TESTVALUE = 8" << endl;
		forward_list<int> fl_ = { 2, 5, 8 };
		forward_list<int> fl = { 1, 11, 111 };
		fl.swap(fl_);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//assign(n, value);使用n个value代替旧有元素
	if (PRINT || TESTVALUE == 9) {
		cout << "TESTVALUE = 9" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		fl.assign(3, 666);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//auto it = find(fl.begin(), fl.end(), value);可以寻找元素是否存在,(distance(fl.begin(), it))返回fl.begin()到it的距离
	if (PRINT || TESTVALUE == 10) {
		cout << "TESTVALUE = 10" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		auto it = find(fl.begin(), fl.end(), 111);
		cout << distance(fl.begin(), it) << endl << endl;
	}

	// merge(fl_);当前链表和另一个已排序的链表合并为一个排序后的链表。  ll容器变空链表.  fl.merge(fl_);
	if (PRINT || TESTVALUE == 11) {
		cout << "TESTVALUE = 11" << endl;
		forward_list<int> fl_ = { 1, 11, 111 };
		forward_list<int> fl = { 2, 5, 8 };
		fl.merge(fl_);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
		
		for (auto value : fl_)
			cout << value << "\t";
		cout << endl << endl;
	}

	//unique();删除链表中相邻的重复元素,只保留一个 fl.unique();
	if (PRINT || TESTVALUE == 12) {
		cout << "TESTVALUE = 12" << endl;
		forward_list<int> fl = { 1, 11, 11, 11, 111 };
		fl.unique();
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//splice_after(iterator pos, fl_);将fl_链表的所有元素转移到当前链表位置 fl.splice_after(it, fl_);  fl_容器变空链表
	//splice_after用法二:splice_after(iterator pos, fl_, iterator value);	fl.splice_after(it, fl_, fl_.begin());
	if (PRINT || TESTVALUE == 13) {
		cout << "TESTVALUE = 13" << endl;
		forward_list<int> fl_ = { 2,5, 8 };
		forward_list<int> fl = { 1, 11, 111 };
		fl.splice_after(fl.begin(), fl_);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl;

		cout << "fl_容器的元素为:" << endl;
		for (auto value : fl_)
			cout << value << "\t";
		cout << endl << endl;
	}

	//remove(value);删除链表中所有值为value的元素; fl.remove(value);
	if (PRINT || TESTVALUE == 14) {
		cout << "TESTVALUE = 14" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		fl.remove(111);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//replace(iterator begin, iterator end, old_value, new_value);将链表中所有等于old_value的元素替换为new_value ,比如这样replace(fl.begin(), fl.end(), 2, 20);
	if (PRINT || TESTVALUE == 15) {
		cout << "TESTVALUE = 15" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		replace(fl.begin(), fl.end(), 11, 666);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//count();  count(fl.begin(), fl.end(), value);
	if (PRINT || TESTVALUE == 16) {
		cout << "TESTVALUE = 16" << endl;
		forward_list<int> fl = { 1, 11, 111, 11, 11 };
		cout << count(fl.begin(), fl.end(), 11) << endl << endl;
	}

	//sort(); fl.sort();	//使用自己的sort()方法,不能使用std::sort()
	if (PRINT || TESTVALUE == 17) {
		cout << "TESTVALUE = 17" << endl;
		forward_list<int> fl = { 111, 1, 11 };
		fl.sort();
		//sort(fl.begin,fl.end());	//报错
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}

	//insert_after(iterator pos, value)
	if (PRINT || TESTVALUE == 18) {
		cout << "TESTVALUE = 18" << endl;
		forward_list<int> fl = { 111, 1, 11 };
		fl.insert_after(fl.before_begin(), 666);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}
	
	//insert_after(iterator pos, n, value)
	if (PRINT || TESTVALUE == 19) {
		cout << "TESTVALUE = 19" << endl;
		forward_list<int> fl = { 111, 1, 11 };
		fl.insert_after(fl.before_begin(), 2, 666);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}
	
	//insert_after(iterator pos, iterator first, iterator last)
	if (PRINT || TESTVALUE == 20) {
		cout << "TESTVALUE = 20" << endl;
		forward_list<int> fl_ = { 3, 4, 5 };
		auto it_first = fl_.begin();
		auto it_last = it_first;
		advance(it_last, 3);
		forward_list<int> fl = { 111, 1, 11 };
		fl.insert_after(fl.begin(), it_first, it_last);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}
	
	//erase_after(iterator pos)
	if (PRINT || TESTVALUE == 21) {
		cout << "TESTVALUE = 21" << endl;
		forward_list<int> fl = { 111, 1, 11 };
		fl.erase_after(fl.begin());
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}
	
	//erase_after(iterator first, iterator last)
	if (PRINT || TESTVALUE == 22) {
		cout << "TESTVALUE = 22" << endl;
		forward_list<int> fl = { 111, 1, 11 };
		auto it_first = fl.begin();
		auto it_last = it_first;
		advance(it_last, 2);
		fl.erase_after(it_first, it_last);
		for (auto value : fl)
			cout << value << "\t";
		cout << endl << endl;
	}
	//remove_if
	if (PRINT || TESTVALUE == 23) {
		cout << "TESTVALUE = 23" << endl;
		forward_list<int> fl = {2, 3, 4, 5, 6, 7, 8};
		fl.remove_if(RemoveIf);
		for (auto value : fl) {
			cout << value << "\t";
		}
		cout << endl << endl;
	}
	//reverse
	if (PRINT || TESTVALUE == 24) {
		cout << "TESTVALUE = 24" << endl;
		forward_list<int> fl = {2, 3, 4, 5, 6, 7, 8};
		fl.reverse();
		for (auto value : fl) {
			cout << value << "\t";
		}
		cout << endl << endl;
	}
	//partition()容器里符合条件的移到前面,不保持相对顺序
	if(PRINT || TESTVALUE == 25){
		cout << "TESTVALUE = 25" << endl;
		forward_list<int> fl = {1, 2, 3, 4, 5, 6, 7, 8};
		partition(fl.begin(), fl.end(), isEven);
		cout << "使用partition后的元素为:" << endl;
		for(auto value : fl){
			cout << value << "\t";	
		}
		cout << endl << endl;
	}

	return 0;
}

下面是forward_list迭代器的用法

#include 
#include 
using namespace std;

const int VALUE = 10;

int main()
{
	forward_list<int> fl = {5, 2, 3, 4, 5};

	//forward_list普通迭代器的用法
	cout << "forward_list普通迭代器的用法" << endl;
	for(forward_list<int>::iterator it = fl.begin(); it != fl.end(); ++it){
		cout << *it << "\t";
	}
	cout << endl;

	//forward_list常量迭代器的用法
	cout << "forward_list常量迭代器的用法" << endl;
	for(forward_list<int>::const_iterator cit = fl.cbegin(); cit != fl.cend(); ++cit){
		cout << *cit << "\t";
	}
	cout << endl;
	
	/*  //forward_list是单向链表容器,所以没有反向迭代器
	//forward_list反向迭代器的用法
	cout << "forward_list反向迭代器的用法" << endl;
	for(forward_list::reverse_iterator rit = fl.rbegin(); rit != fl.rend(); ++rit){
		cout << *rit << "\t";
	}
	cout << endl;
	
	//forward_list常量反向迭代器的用法
	cout << "forward_list常量反向迭代器的用法" << endl;
	for(forward_list::const_reverse_iterator crit = fl.crbegin(); crit != fl.crend(); ++crit){
		cout << *crit << "\t";
	}
	cout << endl << endl;
	*/
	
	for(forward_list<int>::iterator it = fl.begin(); it != fl.end(); ){
		cout << "*it = " << *it << endl;
		if(*it == 3){
			it = fl.insert_after(it, 3 * VALUE);
			//此时*it的值是新插入的值,所以需要执行++两次
			++it;
			++it;
		}else if(*it == 2){
			//使用erase之后,返回的是下一个有效迭代器的值
			it = fl.erase_after(it);
		}else{
			++it;	
		}
	}
	
	cout << "1现在容器的元素为:" << endl;
	for(auto value : fl){
		cout << value  << "\t";	
	}
	cout << endl << endl;
	
	
	forward_list<int>::iterator testIt_1 = fl.begin();
	++testIt_1;
	++testIt_1;
	testIt_1 = fl.insert_after(testIt_1, 40);
	testIt_1++;
	cout << *testIt_1 << endl;
	
	forward_list<int>::iterator testIt_2 = fl.begin();
	++testIt_2;
	++testIt_2;
	++testIt_2;
	++testIt_2;
	cout << *testIt_2 << endl;
	
	if(testIt_1 == testIt_2){
		cout << "testIt_1与testIt_2的迭代器相等" << endl;	
	}else{
		cout << "testIt_1与testIt_2的迭代器不相等" << endl;	
	}
	//从打印中知道,这样的话两个迭代器是相等的
	cout << endl;

	cout << "2现在容器的元素为:" << endl;
	for(auto value : fl){
		cout << value  << "\t";	
	}
	cout << endl;

	forward_list<int>::iterator testIt_3 = fl.begin();
	++testIt_3;
	++testIt_3;
	++testIt_3;
	cout << *testIt_3 << endl;
	
	forward_list<int>::iterator testIt_4 = fl.begin();
	++testIt_4;
	++testIt_4;
	testIt_4 = fl.insert_after(testIt_4, 50);
	++testIt_4;
	cout << *testIt_4 << endl;
	if(testIt_3 == testIt_4){
		cout << "testIt_3与testIt_4的迭代器相等" << endl;	
	}else{
		cout << "testIt_3与testIt_4的迭代器不相等" << endl;	
	}
	//从打印中知道,这样的话两个迭代器是相等的
	cout << endl;
	
	cout << "3现在容器的元素为:" << endl;
	for(auto value : fl){
		cout << value  << "\t";	
	}
	cout << endl;

	cout << *testIt_3 << endl;
	//testIt_3--; 单向链表,不能这样用
	//cout << *testIt_3 << endl;

	return 0;
}

forward_list迭代器移动的方式如下:

#include 
#include 
#include 
using namespace std;

int main()
{
	forward_list<int> fl = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	cout << "容器的元素为:" << endl;
	for(auto value : fl){
		cout << value << "\t";	
	}
	cout << endl;

	forward_list<int>::iterator it = fl.begin();
	cout << "fl.begin()的值为:" << *it << endl;
	//it += 1;		//it = it + 1;		//不能这样使用
	++it;			//前缀加加
	cout << "执行++it;后,*it的值为:" << *it << endl;
	//--it;			//前缀减减		//不能这样使用
	//cout << *it << endl;
	it++;			//后缀加加
	cout << "执行it++;后,*it的值为:" << *it << endl;
	//it--;			//后缀减减		//不能这样使用
	//cout << *it << endl;

	advance(it, 1);		//这个有可能越界的,可以先使用distance()计算
	cout << "执行advance(it, 1);后,*it的值为:" << *it << endl;
	//advance(it, -1);			//不能这样使用
	//cout << *it << endl;

	cout << "distance(it, fl.end())的值为:" << distance(it, fl.end()) << endl;
	if (distance(it, fl.end()) >= 10) {
		advance(it, 10);		//这样就不会溢出	
	}
	else {
		cout << "没有执行advance(it, 10);" << endl;
	}
	cout << "distance(fl.begin(), it)的值为:" << distance(fl.begin(), it) << endl;
	if (distance(fl.begin(), it) >= 10) {
		advance(it, -10);
	}
	else {
		cout << "没有执行advance(it, -10);" << endl;
	}
	/*			//不能这样使用
	cout << "distance(it, fl.begin())的值为:" << distance(it, fl.begin()) << endl;
	if (distance(it, fl.begin()) <= -10) {
		advance(it, -10);
	}
	else {
		cout << "没有执行advance(it, -10);" << endl;
	}
	*/
	it = next(it, 1);		//第二个参数不能为负值
	if (it != fl.end()) {
		cout << "执行next(it, 1);后,*it的值为:" << *it << endl;
	}
	else {
		//抛出异常	
	}
	/*		//不能这样使用
	it = prev(it, 1);		//第二个参数不能为负值
	if (it == fl.begin()) {
		//这里有可能真正的到达第一个迭代器,也有可能已经越界	
	}
	*/

	return 0;
}

会发生forward_lise迭代器失效的例子如下

#include 
#include 
using namespace std;

const bool PRINT = true;
const int TESTVALUE = 111;

int main()
{
	
	//在迭代器之前插入,不会使forward_list迭代器失效
	if(PRINT || TESTVALUE == 1){
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();
		++it_1;
	
		fl.insert_after(fl.before_begin(), 666);
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
	}
	
	//在迭代器之后插入,插入不会使forward_list迭代器失效
	if(PRINT || TESTVALUE == 2){
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();
		fl.insert_after(fl.begin(), 666);
		++it_1;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
	}
	
	//fl.insert_after(it_1, 666); 这样会使迭代器失效
	//解决方法一
	if(PRINT || TESTVALUE == 3){
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();
		fl.insert_after(it_1++, 666);
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
	}
	//解决方法二
	if(PRINT || TESTVALUE == 4){
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();
		it_1 = fl.insert_after(it_1, 666);
		++it_1;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;
	}
	if(PRINT || TESTVALUE == 5){
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();
		fl.erase_after(fl.begin());
		it_1++;
		cout << *it_1 << endl;
		++it_1;
		cout << *it_1 << endl;	
	}
	
	if(PRINT || TESTVALUE == 6){
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();
		fl.erase_after(it_1);		//迭代器失效
		++it_1;
		cout << *it_1 << endl;
	}
	
	{
		forward_list<int> fl = {5, 2, 3, 4, 5};
		auto it_1 = fl.before_begin();	
		fl.erase_after(it_1++);	//不可以这样使用,会报错	
	}
	
	return 0;
}

其他方法对迭代器的影响

#include 
#include 
#include 
#include 
using namespace std;

const bool PRINT = true;
const int TESTVALUE = 666;

int main()
{
	//swap();交换两个容器的元素		//fl.swap(fl_);
	if (PRINT || TESTVALUE == 1) {
		cout << "TESTVALUE = 1" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		auto it = fl.begin();
		auto it_end = fl.end();
		forward_list<int> fl_ = { 2, 5, 8 };
		fl.swap(fl_);
		
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}

	//assign(n, value);使用n个value代替旧有元素
	if (PRINT || TESTVALUE == 2) {
		cout << "TESTVALUE = 2" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		auto it = fl.begin();
		auto it_end = fl.end();
		fl.assign(6, 666);
		//迭代器已经失效
		cout << endl;
	}

	// merge(fl_);当前链表和另一个已排序的链表合并为一个排序后的链表。  fl容器变空链表
	if (PRINT || TESTVALUE == 3) {
		cout << "TESTVALUE = 3" << endl;
		forward_list<int> fl_ = { 1, 11, 111 };
		forward_list<int> fl = { 2, 5, 8 };
		auto it = fl.begin();

		/*  方式一
		fl.merge(fl_);

		auto it_end = fl.end();
		for (; it != it_end; ++it) {
			cout << *it << endl;
		}
		*/
		//方式二
		auto it_end = fl.end();
		fl.merge(fl_);
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}


	//unique();删除链表中相邻的重复元素,只保留一个 fl.unique();
	if (PRINT || TESTVALUE == 4) {
		cout << "TESTVALUE = 4" << endl;
		forward_list<int> fl = { 1, 11, 11, 11, 111 };
		auto it = fl.begin();
		/* 方式一
		fl.unique();
		auto it_end = fl.end();
		for (; it != it_end; ++it) {
			cout << *it << endl;
		}
		*/

		//方式二
		auto it_end = fl.end();
		fl.unique();
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}

	//splice_after(iterator pos, fl_);将fl_链表的所有元素转移到当前链表位置 fl.splice_after(it, fl_);  ll容器变空链表
	//splice_after用法二:splice_after(iterator pos, fl_, iterator value);	fl.splice_after(it, fl_, fl_.begin());
	if (PRINT || TESTVALUE == 5) {
		cout << "TESTVALUE = 5" << endl;
		forward_list<int> fl_ = { 2,5, 8 };
		forward_list<int> fl = { 1, 11, 111 };
		auto it = fl.begin();

		/*  //方式一
		fl.splice_after(fl.begin(), fl_);
		auto it_end = fl.end();
		for (; it != it_end; ++it) {
			cout << *it << endl;
		}
		*/

		//方式二
		auto it_end = fl.end();
		fl.splice_after(fl.begin(), fl_);
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}

	//remove(value);删除链表中所有值为value的元素; fl.remove(value);
	if (PRINT || TESTVALUE == 6) {
		cout << "TESTVALUE = 6" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		auto it = fl.begin();
		/*  方式一
		fl.remove(111);
		auto it_end = fl.end();
		for (; it != it_end; ++it) {
			cout << *it << endl;
		}
		*/

		//方式二
		auto it_end = fl.end();
		fl.remove(111);
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}

	//replace(iterator begin, iterator end, old_value, new_value);将链表中所有等于old_value的元素替换为new_value ,比如这样replace(fl.begin(), fl.end(), 2, 20);
	if (PRINT || TESTVALUE == 7) {
		cout << "TESTVALUE = 7" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		auto it = fl.begin();

		/*   方式一
		replace(fl.begin(), fl.end(), 11, 666);
		auto it_end = fl.end();
		for (; it != it_end; ++it) {
			cout << *it << endl;
		}
		*/

		//方式二
		auto it_end = fl.end();
		replace(fl.begin(), fl.end(), 11, 666);
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}

	//sort(); fl.sort();
	if (PRINT || TESTVALUE == 8) {
		cout << "TESTVALUE = 8" << endl;
		forward_list<int> fl = { 111, 1, 11 };
		auto it = fl.begin();
		auto it_end = fl.end();
		fl.sort();		//迭代器已经失效
		cout << endl;
	}
	//push_front()
	if (PRINT || TESTVALUE == 9) {
		cout << "TESTVALUE = 9" << endl;
		forward_list<int> fl = { 1, 11, 111 };
		auto it = fl.before_begin();
		fl.push_front(666);
		auto it_end = fl.end();
		++it;
		for (; it != it_end; ++it) {
			cout << *it << "\t";
		}
		cout << endl << endl;
	}

	return 0;
}

上面讲了std::forward_list的方法和迭代器,下面说说std::forward_list的使用场景

1、节省内存:如果只需要单向遍历数据并且希望节省内存,可以使用std::forward_list
2 、头部操作频繁:当需要频繁在头部插入或删除元素时,std::forward_list比std::list更合适
3、不需要尾部操作
4、实现栈或队列

最后给加一个chatgpt中STL的array的方法回答吧

`forward_list`是C++标准模板库(STL)中的一个单向链表容器。下面是`forward_list`容器的所有方法及其作用:

### 构造函数
- **`forward_list()`**: 默认构造函数,创建一个空的`forward_list`。
- **`forward_list(size_type n)`**: 创建一个包含`n`个默认值的元素的`forward_list`。
- **`forward_list(size_type n, const T& value)`**: 创建一个包含`n`个值为`value`的元素的`forward_list`。
- **`forward_list(InputIterator first, InputIterator last)`**: 创建一个包含区间`[first, last)`中元素的`forward_list`。
- **`forward_list(const forward_list& other)`**: 拷贝构造函数,创建一个包含与`other`相同元素的`forward_list`。
- **`forward_list(forward_list&& other)`**: 移动构造函数,创建一个从`other`移动过来的`forward_list`。
- **`forward_list(std::initializer_list<T> ilist)`**: 初始化列表构造函数,创建一个包含`initializer_list`中元素的`forward_list`。

### 赋值操作
- **`forward_list& operator=(const forward_list& other)`**: 拷贝赋值操作符。
- **`forward_list& operator=(forward_list&& other)`**: 移动赋值操作符。
- **`forward_list& operator=(std::initializer_list<T> ilist)`**: 赋值初始化列表中的元素给这个`forward_list`。

### 迭代器
- **`iterator begin()`**: 返回指向容器中第一个元素的迭代器。
- **`const_iterator begin() const`**: 返回指向容器中第一个元素的常量迭代器。
- **`iterator end()`**: 返回指向容器末尾的迭代器(容器末尾的下一个位置)。
- **`const_iterator end() const`**: 返回指向容器末尾的常量迭代器。

### 容量
- **`bool empty() const`**: 检查容器是否为空。
- **`size_type max_size() const`**: 返回容器中元素的最大可能数量。

### 修改器
- **`void assign(size_type n, const T& value)`**: 将容器中的内容替换为`n`个值为`value`的元素。
- **`void assign(InputIterator first, InputIterator last)`**: 将容器中的内容替换为区间`[first, last)`中的元素。
- **`void assign(std::initializer_list<T> ilist)`**: 将容器中的内容替换为`initializer_list`中的元素。
- **`void push_front(const T& value)`**: 在容器的开头插入一个值为`value`的元素。
- **`void push_front(T&& value)`**: 在容器的开头插入一个移动的值为`value`的元素。
- **`void pop_front()`**: 移除容器中的第一个元素。
- **`iterator insert_after(const_iterator pos, const T& value)`**: 在`pos`位置之后插入一个值为`value`的元素。
- **`iterator insert_after(const_iterator pos, T&& value)`**: 在`pos`位置之后插入一个移动的值为`value`的元素。
- **`iterator insert_after(const_iterator pos, size_type n, const T& value)`**: 在`pos`位置之后插入`n`个值为`value`的元素。
- **`iterator insert_after(const_iterator pos, InputIterator first, InputIterator last)`**: 在`pos`位置之后插入区间`[first, last)`中的元素。
- **`iterator insert_after(const_iterator pos, std::initializer_list<T> ilist)`**: 在`pos`位置之后插入`initializer_list`中的元素。
- **`iterator erase_after(const_iterator pos)`**: 移除`pos`位置之后的元素。
- **`iterator erase_after(const_iterator first, const_iterator last)`**: 移除区间`[first, last)`中的元素。
- **`void swap(forward_list& other)`**: 交换两个`forward_list`容器的内容。
- **`void resize(size_type n)`**: 调整容器的大小为`n`,如果当前大小大于`n`,则移除多余的元素,如果当前大小小于`n`,则插入缺少的默认值元素。
- **`void resize(size_type n, const T& value)`**: 调整容器的大小为`n`,如果当前大小大于`n`,则移除多余的元素,如果当前大小小于`n`,则插入缺少的值为`value`的元素。
- **`void clear()`**: 移除容器中的所有元素。

### 操作
- **`void remove(const T& value)`**: 移除所有值为`value`的元素。
- **`template <class Predicate> void remove_if(Predicate pred)`**: 移除所有满足谓词`pred`的元素。
- **`void unique()`**: 移除所有相邻的重复元素。
- **`template <class BinaryPredicate> void unique(BinaryPredicate binary_pred)`**: 使用二元谓词`binary_pred`移除所有相邻的重复元素。
- **`void merge(forward_list& other)`**: 合并另一个`forward_list`到当前容器,两个容器必须已排序。
- **`template <class Compare> void merge(forward_list& other, Compare comp)`**: 使用比较函数`comp`合并另一个`forward_list`到当前容器。
- **`void sort()`**: 对容器中的元素进行升序排序。
- **`template <class Compare> void sort(Compare comp)`**: 使用比较函数`comp`对容器中的元素进行排序。
- **`void reverse()`**: 反转容器中的元素顺序。
- **`void splice_after(const_iterator pos, forward_list& other)`**: 将`other`中的所有元素接合到当前容器的`pos`位置之后。
- **`void splice_after(const_iterator pos, forward_list&& other)`**: 将`other`中的所有元素接合到当前容器的`pos`位置之后(右值版本)。
- **`void splice_after(const_iterator pos, forward_list& other, const_iterator it)`**: 将`other`中的单个元素接合到当前容器的`pos`位置之后。
- **`void splice_after(const_iterator pos, forward_list&& other, const_iterator it)`**: 将`other`中的单个元素接合到当前容器的`pos`位置之后(右值版本)。
- **`void splice_after(const_iterator pos, forward_list& other, const_iterator first, const_iterator last)`**: 将`other`中`[first, last)`的元素接合到当前容器的`pos`位置之后。
- **`void splice_after(const_iterator pos, forward_list&& other, const_iterator first, const_iterator last)`**: 将`other`中`[first, last)`的元素接合到当前容器的`pos`位置之后(右值版本)。


### 观察器
- **`allocator_type get_allocator() const`**: 返回与容器关联的分配器。

你可能感兴趣的:(windows,数据结构)