每日学习笔记:C++ STL 的forward_list

定义

特点

操作函数

元素查找、移除或安插

forward_list::emplace_after

**arg...**指的是元素构造函数的参数(0~N个)

cpp 复制代码
#include <iostream>
#include <memory>
#include <list>
#include <forward_list>
using namespace std;

class aaa
{
public:
	aaa() { 
		c = 666;
	};
	aaa(int a, int b) {
		c = a + b;
	};
	friend std::ostream& operator << (std::ostream& o, const aaa& s) {
		o << s.c;
		return o;
	}

private:
	int c;
};

int main()
{
	forward_list<aaa> t1{ {1,1},{},{2,2} }; 
	std::copy(t1.cbegin(), t1.cend(), std::ostream_iterator<aaa>(cout, " "));
	cout << endl;

	t1.emplace_after(t1.before_begin(), 6, 8);
	std::copy(t1.cbegin(), t1.cend(), std::ostream_iterator<aaa>(cout, " "));
	cout << endl;

	t1.emplace_after(t1.before_begin());
	std::copy(t1.cbegin(), t1.cend(), std::ostream_iterator<aaa>(cout, " "));
	cout << endl;

	forward_list<int> t{ 1,2,3 }; 
	t.emplace_after(t.before_begin(), 55);
	std::copy(t.cbegin(), t.cend(), std::ostream_iterator<int>(cout, "-"));
	for (;;);
}

forward_list::splice_after

<C++标准库第二版>书中介绍了c.splice_after(pos,c2,c2pos)的定义【将c2pos所指的下一个转移到pos所指的下一个】,但是示例代码却写成了

这个调用的参数顺序与函数定义的参数顺序并不一致,于是我专门验证了一下,发现这个写法的运行结果与按照函数定义的参数顺序t2.splice_after(pos2, t1, pos1);运行结果居然相同,甚至我改成了下面这样的调用,结果仍然相同

cpp 复制代码
forward_list<int> t3; //定义一个空的forward_list
t3.splice_after(pos2, forward_list<int>(), pos1); //形参传入一个空的forward_list

细看了一下 splice_after函数实现发现,在没有开启DEBUG宏的情况下,其内部并没有操作形参传入的forward_list参数,而只是对迭代器pos2、pos1之右(后)所指内容进行了拼接。即常规的单向链表拼接的指针操作。

示例代码:

cpp 复制代码
#include <iostream>
#include <forward_list>
using namespace std;

int main()
{
	forward_list<int> t1{1,2,3,4,5};
	forward_list<int> t2{ 97,98,99};
	auto pos1 = t1.before_begin();
	for (auto pb1 = t1.begin(); pb1 != t1.end(); ++pb1,++pos1)
	{
		if (*pb1 == 3)
		{
			break;
		}
	}

	auto pos2 = t2.before_begin();
	for (auto pb2 = t2.begin(); pb2 != t2.end(); ++pb2, ++pos2)
	{
		if (*pb2 == 99)
		{
			break;
		}
	}

	t1.splice_after(pos2, t2, pos1);
	//t2.splice_after(pos2, t1, pos1);
	//forward_list<int> t3;
	//t3.splice_after(pos2, forward_list<int>(), pos1);
	

	//t2.splice_after(pos2, t1, t1.before_begin());
	//t2.splice_after(pos2, t1, t1.begin());
	for (;;);
}
相关推荐
知识分享小能手12 分钟前
微信小程序入门学习教程,从入门到精通,项目实战:美妆商城小程序 —— 知识点详解与案例代码 (18)
前端·学习·react.js·微信小程序·小程序·vue·前端技术
情深不寿31722 分钟前
C++特殊类的设计
开发语言·c++·单例模式
做科研的周师兄31 分钟前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
Vanranrr37 分钟前
nullptr vs NULL:C/C++ 空指针的演变史
c语言·c++
切糕师学AI44 分钟前
【多线程】阻塞等待(Blocking Wait)(以C++为例)
c++·多线程·并发编程·阻塞等待
Sunsets_Red1 小时前
差分操作正确性证明
java·c语言·c++·python·算法·c#
QZ_orz_freedom1 小时前
学习笔记--文件上传
java·笔记·学习
deng-c-f1 小时前
Linux C/C++ 学习日记(24):UDP协议的介绍:广播、多播的实现
linux·网络·学习·udp
摇滚侠1 小时前
Spring Boot 3零基础教程,整合Redis,笔记12
spring boot·redis·笔记
爱吃甜品的糯米团子1 小时前
Linux 学习笔记之 VI 编辑器与文件查找技巧
linux·笔记·学习