C++ STL::list常用操作及底层实现(中2)——实现list常用操作之删除(erase、remove、pop_front、pop_back、clear)

2023-11-07


上一篇我们介绍了插入的常用操作,本文介绍删除的相关操作。

1.erase():按链表迭代器删除

它有两种函数形式:
格式1:iterator erase (iterator position)
格式2:iterator erase (iterator first, iterator last)
下面分别介绍两种形式的用法,及实现这两种格式。

1.1函数格式1:iterator erase (iterator position)

  • 解释:删除position位置的元素,并返回被删除的元素的下一个元素的迭代器
  • 举例:有一个链表l:1<->2<->3。执行erase(l.begin())后链表变为2<->3,返回2位置的迭代器。

我的实现:

template <typename T>
Iterator<T> Mylist<T>::erase(Iterator<T> it)
{
	ListNode<T> *cur = it.current;
	for (Iterator<T> i = this->Begin(); i != this->End(); ++i){
		if (i == it){
			it.current->rightlink->leftlink = it.current->leftlink;
			it.current->leftlink-> rightlink = it.current->rightlink;
			it++;
			delete cur;

			break;
		}
	}
	return it;
}

1.2函数格式2:iterator erase (iterator first, iterator last)

  • 解释:删除[first,last)位置的元素,并返回被删除的元素的下一个元素的迭代器,也就是last迭代器
  • 举例:有一个链表l:1<->2<->3。执行erase(l.begin(),–l.end())后链表变为3,返回3位置的迭代器。
  • 使用注意:当first = last时,不删除元素,但是返回的迭代器是last对应的位置。

我的实现:
通过调用erase格式1形式来实现。
Notes:在STL::list实现中,当first = begin(),last = end()时,它调用了clear()函数,所以我也按照它来实现。其实我认为直接用while调用第一种格式的erase也能实现,为什么STL要这么做我现在也不太明白,如果有大佬知道,希望大佬能告知,评论也行,私信也可以。

template <typename T>
Iterator<T> Mylist<T>::erase(Iterator<T> first, Iterator<T> last)
{
	if (first == this->Begin() && last == this->End()){	
		Clear();// erase all and return fresh iterator
		return last;
	}
	else{	// erase subrange
		while (first != last)
			first = erase(first);

		return first;
	}
}

2.remove():按值执行删除操作

函数格式:void remove (const value_type& val)

  • 解释:删除链表中值为val的元素
  • 举例:有一个链表l:1<->2<->3<->1。执行remove (1)后链表变为2<->3

我的实现:
通过调用第一种格式erase()来实现。

template <typename T>
void Mylist<T>::Remove(const T& _data)
{
	for (Iterator<T> i = this->Begin(); i != this->End();){
		if (*i == _data){
			i = erase(i);
		}
		else{
			++i;
		}
	}
}

3. pop_front、pop_back:删除链表头和链表尾的元素

  • 解释:pop_front删除链表头元素;pop_back删除链表尾部数据。
  • 举例:有一个链表l:1<->2<->3<->1。执行pop_front ()后链表变为2<->3<->1;再执行pop_back(),链表变为2<->3
    我的实现:
template <typename T>
void Mylist<T>::Pop_front()
{
	erase(this->Begin());
}
template <typename T>
void Mylist<T>::Pop_back()
{
	erase(--this->End());
}

4. clear:清除链表所有元素

  • 解释:清除链表中的所有元素
  • 有一个链表l:1<->2<->3<->1。执行clear ()后链表变为空

我的实现:

template <typename T>
void Mylist<T>::Clear()
{
	ListNode<T> *cur = first->rightlink;//保存fisrt的下一个节点

	first->leftlink = first;//first的左指针指向自己
	first->rightlink = first;//first的右指针指向自己

	/*释放节点*/
	while (cur != first){
		ListNode<T> *tmp = cur;
		cur = cur->rightlink;
		delete tmp;
	}
}

5.完整代码(包括插入和删除)

Mylist.h

#ifndef _MY_LIST_H
#define _MY_LIST_H

template <typename T>
class Mylist;

template <typename T>
class Iterator;

//定义双向链表的结点类
template <typename T>
class ListNode
{
	friend class Mylist<T>;//Mylist类为ListNode类的友元,从而可以访问其私有成员
	friend class Iterator<T>;//迭代器类Iterator为ListNode类的友元,从而可以访问其私有成员
private:
	T data;
	ListNode<T> * leftlink;
	ListNode<T> * rightlink;

	ListNode() :leftlink(nullptr), rightlink(nullptr){};
	ListNode(T _data) :data(_data), leftlink(nullptr), rightlink(nullptr){}
};


//定义双向链表类
template <typename T>
class Mylist
{
public:

	Mylist();
	~Mylist();

	Iterator<T> Begin();
	Iterator<T> End();
	/********************插入**********************/
	Iterator<T> Insert(Iterator<T> it, const T& _data);//插入数据
	Iterator<T> Insert(Iterator<T> it, int n, const T& _data);//插入数据
	template <class Iter>
	Iterator<T> Insert(Iterator<T> it, Iter first, Iter last);//插入数据

	void Push_front(const T& _data);//在表头插入
	void Push_back(const T& _data);//在末尾插入

	void Splice(Iterator<T> it, Mylist<T> & x);
	void Splice(Iterator<T> it, Mylist<T> & x,Iterator<T> i);
	void Splice(Iterator<T> it, Mylist<T> & x, Iterator<T> first, Iterator<T> last);

	/*******************删除**********************/
	Iterator<T> erase(Iterator<T> it);
	Iterator<T> erase(Iterator<T> first, Iterator<T> last);

	void Remove(const T& _data);//删除数据

	void Pop_front();//删除表头元素
	void Pop_back();//删除最后一个元素

	void Clear();//删除全部数据
	
	bool Empty();
private:
	ListNode<T> * first;
};

//定义迭代器iterator
template <typename T>
class Iterator
{
	friend class Mylist<T>;//Mylist类为Iterator类的友元,从而可以访问其私有成员
public:
	Iterator() :current(nullptr){}
	Iterator(ListNode<T> *& node) :current(node){}

	//重载解引用符*
	T& operator*()
	{
		return this->current->data;
	}

	//重载前缀自加运算符++
	Iterator<T>& operator++()
	{
		this->current = this->current->rightlink;
		return *this;
	}
	//重载后缀自加运算符++
	Iterator<T> operator++(int)
	{
		Iterator<T> tmp = *this;
		(*this).current = (*this).current->rightlink;

		return tmp;
	}

	//重载前缀自减运算符--
	Iterator<T>& operator--()
	{
		this->current = this->current->leftlink;
		return *this;
	}
	//重载后缀自加运算符--
	Iterator<T> operator--(int)
	{
		Iterator<T> tmp = *this;
		(*this).current = (*this).current->leftlink;

		return tmp;
	}

	//重载不等比较运算!=
	bool operator!=(const Iterator<T>& it)
	{
		return this->current != it.current;
	}
	//重载等于比较运算==
	bool operator==(const Iterator<T>& it)
	{
		return this->current == it.current;
	}

	//重载->
	T* operator->()
	{
		return &(this->current->data);
	}

private:
	ListNode<T> * current;//节点指针
};



/***************************构造和析构函数*************************/
template <typename T>
Mylist<T>::Mylist()
{
	first = new ListNode<T>;//生成一个表头结点,它里面不带数据
	first->leftlink = first->rightlink = first;//左右都指向自己
}
template <typename T>
Mylist<T>::~Mylist()
{
}


/*********************Begin()和End()返回链表头和尾的迭代器***********************/
template <typename T>
Iterator<T> Mylist<T>::Begin()
{
	return Iterator<T>(first->rightlink);
}
template <typename T>
Iterator<T> Mylist<T>::End()
{
	return Iterator<T>(first);
}

/***************************插入数据Insert()*****************************/
template <typename T>
Iterator<T> Mylist<T>::Insert(Iterator<T> it, const T& _data)
{
	ListNode<T> *newNode = new ListNode<T>(_data);//生成一个节点

	//1.确定插入节点的指向
	newNode->leftlink = it.current->leftlink;
	newNode->rightlink = it.current;
	//2.改变迭代器it指向节点的指向
	it.current->leftlink = newNode;
	//3.改变插入节点的前一个节点指向
	newNode->leftlink->rightlink = newNode;

	return  Iterator<T>(newNode);
}
template <typename T>
Iterator<T> Mylist<T>::Insert(Iterator<T> it, int n, const T& _data)
{
	for (; n>0; --n)
		it = Insert(it, _data);
	return it;
}
template <typename T>
template <class Iter>
Iterator<T> Mylist<T>::Insert(Iterator<T> it, Iter first, Iter last)
{
	Iter _first = first;

	for (; last != first; ++first){
		Insert(it, *first);
	}
	for (; last != _first; ++_first){
		it--;
	}
	return it;
}
/***************************插入数据push_front()\push_back()****************************/
template <typename T>
void Mylist<T>::Push_front(const T& _data)
{
	Insert(this->Begin(),_data);
}
template <typename T>
void Mylist<T>::Push_back(const T& _data)
{
	Insert(this->End(), _data);
}
/***************************插入数据Splice()****************************/
template <typename T>
void Mylist<T>::Splice(Iterator<T> it, Mylist<T> & x)
{
	Splice(it,x,x.Begin(),x.End());
}
template <typename T>
void Mylist<T>::Splice(Iterator<T> it, Mylist<T> & x, Iterator<T> i)
{
	Iterator<T> tmp = i;
	//检测i是否为x的迭代器
	for (Iterator<T> ite = x.Begin(); ite != x.End(); ite++){
		if (ite == i){
			Splice(it, x, i, ++tmp);
			break;
		}
	}
}
template <typename T>
void Mylist<T>::Splice(Iterator<T> it, Mylist<T> & x, Iterator<T> first, Iterator<T> last)
{
	Iterator<T> _first = first;

	bool InList = false;
	bool OneList = false;

	//1.当x和this不是同一个,并且x不为空时,执行操作
	if (this != &x && !x.Empty()){
		//2.检测first是不是x的迭代器
		for (Iterator<T> tmp = x.Begin(); tmp != x.End(); tmp++){
			if (tmp == first){
				InList = true;
				break;
			}
		}
		//3.判断last是否>first,并且判断first到last是不是一条完整的链表
		while (InList && first!=last && ++_first != x.End()){
			if (_first.current == last.current){
				OneList = true;
				break;
			}
		}
		if (first != last && _first == x.End() && _first.current == last.current)
			OneList = true;

		//4.splice操作
		if (InList == true && OneList == true){
			ListNode<T> *lastNodePre = last.current->leftlink;

			first.current->leftlink->rightlink = last.current;
			last.current->leftlink = first.current->leftlink;

			first.current->leftlink = it.current->leftlink;

			it.current->leftlink->rightlink = first.current;
			it.current->leftlink = lastNodePre;

			lastNodePre->rightlink = it.current;
		}
	}
}

/***************************按迭代器删除数据erase()****************************/
template <typename T>
Iterator<T> Mylist<T>::erase(Iterator<T> it)
{
	ListNode<T> *cur = it.current;
	for (Iterator<T> i = this->Begin(); i != this->End(); ++i){
		if (i == it){
			it.current->rightlink->leftlink = it.current->leftlink;
			it.current->leftlink-> rightlink = it.current->rightlink;
			it++;

			delete cur;
			break;
		}
	}
	return it;
}
template <typename T>
Iterator<T> Mylist<T>::erase(Iterator<T> first, Iterator<T> last)
{
	if (first == this->Begin() && last == this->End()){	
		Clear();// erase all and return fresh iterator
		return last;
	}
	else{	// erase subrange
		while (first != last)
			first = erase(first);

		return first;
	}
}

/***************************按数值删除数据:remove()****************************/
template <typename T>
void Mylist<T>::Remove(const T& _data)
{
	for (Iterator<T> i = this->Begin(); i != this->End();){
		if (*i == _data){
			i = erase(i);
		}
		else{
			++i;
		}
	}
}

/***************************Pop_front、Pop_back****************************/
template <typename T>
void Mylist<T>::Pop_front()
{
	erase(this->Begin());
}
template <typename T>
void Mylist<T>::Pop_back()
{
	erase(--this->End());
}
/***************************删除全部数据Clear()****************************/
template <typename T>
void Mylist<T>::Clear()
{
	ListNode<T> *cur = first->rightlink;//保存fisrt的下一个节点

	first->leftlink = first;//first的左指针指向自己
	first->rightlink = first;//first的右指针指向自己

	/*释放节点*/
	while (cur != first){
		ListNode<T> *tmp = cur;
		cur = cur->rightlink;
		delete tmp;
	}
}

template <typename T>
bool Mylist<T>::Empty()
{
	return first->rightlink == first;
}
#endif

好了,list的删除操作就完成了,下一篇文章将实现list的一些其他的操作。

如果有疑问,欢迎评论区下方留言;本人水平有限 ,如有错误,也欢迎在评论区下方批评指正。若是喜欢本文,就帮忙点赞吧!

系列文章链接:
C++ STL::list常用操作及底层实现(上)——实现list迭代器

C++ STL::list常用操作及底层实现(中1)——实现list常用操作之插入(insert、push_front、push_back、splice)

C++ STL::list常用操作及底层实现(中2)——实现list常用操作之删除(erase、remove、pop_front、pop_back、clear)

C++ STL::list常用操作及底层实现(下)——实现list其他常用操作(reverse、assign、front、back)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL::list常用操作及底层实现(中2)——实现list常用操作之删除(erase、remove、pop_front、pop_back、clear) 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • JDBC学习笔记一之JDBC的下载、引用、标准api介绍

    1 下载MySQL的JDBC驱动jar包 进入MySQL官网 https www mysql com 然后按图操作 2 下载Oracle的JDBC驱动jar包 按图提示操作 2 1引用Oracle的JDBC驱动jar包 2 2 Oracle
  • 软件测试工程师工作有多累?怎么入门学习软件测试呢?

    软件测试随着时间的发展 越来越受欢迎了 那么 你了解过软件测试吗 软件测试工程师工作累吗 跟随千锋一起来了解一下吧 1 其实IT行业都需要经常加班的 所以软件测试和软件开发其实都一样 当然了 一般来说开发会更累一点 2 目前国内软件测试的待
  • neo4j 内存介绍

    描述Neo4j内存配置和使用的不同方面 内容翻译neo4j 操作手册 1 总览 1 1 操作系统内存 必须保留一些内存以运行操作系统本身的进程 不可能显式配置应为操作系统保留的RAM数量 因为这是在配置页面缓存和堆空间之后仍保持可用的RAM
  • 遍历子文件编码格式互换(UTF-8与GB2312)

    遍历子文件编码格式互换 UTF 8与GB2312 在日常开发中 我们经常会遇到需要将文件的编码格式从一种转换为另一种的情况 特别是在不同的操作系统和编辑器之间共享代码文件时 本篇文章将介绍一个Python脚本 用于遍历指定文件夹下的所有 c
  • 12月9号实验报告四

    完成apache服务器能够使用php解析 phtml php3 第一步 先修改配置文件httpd conf 添加 phtml php3 第二步 创建 phtml文件 php3文件 第三步 验证 phtml文件 php3文件
  • MyBatis(四) 主键生成策略

    1 数据库支持自动生成主键 若数据库支持自动生成主键的字段 比如 MySQL和 SQL Server 则可以设置useGeneratedKeys true 然后再把keyProperty 设置到目标属性上 mysql 支持自增主键 自增主键
  • Python3入门基础(10)一个对象

    Python3 面向对象 面向对象技术 与 Java 类似 类 Class 用来描述具有相同的属性和方法的对象的集合 它定义了该集合中每个对象所共有的属性和方法 对象是类的实例 方法 类中定义的函数 类变量 类变量在整个实例化的对象中是公用
  • discuz手机端默forum.php,discuz手机wap版模板开发方式简述

    近期项目需要对discuz论坛的手机模板进行开发调整 在官方论坛和搜索引擎找了很久 都没有找到相应的文章 只好自己着手开始研究 手机模板文件的所在目录 template default mobile 手机模板文件的主目录 template
  • 用Python+PIL将多个jpg图像批量合并成一个pdf文件

    一 引言 在 用Python PIL将目录下jpg图像批量转成pdf文件 介绍了将一个目录下所有的jpg文件批量转成一对一的pdf文件的方法 但单位后来又要求将所有图片合并到一个PDF中看 在实际工作中 确实有时还需要将批量图片文件合并生成
  • 用于视觉跟踪的在线特征选择研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 视觉跟踪是计算机视觉中的重要任务之一 它涉
  • QQuickWidget + QML编程实现酷炫动态动画效果

    1 具体需求 当Qt开发项目中需要实现简单的动态酷炫动画效果时 我们可以使用Qt中的QQuickWidget来实现 同时还可以使用QML编程来实现具体的动画效果 具体实现的效果如下所示 2 具体操作和实现效果图 1 按下start按钮 音乐
  • 解决win10运行Android Studio卡死问题

    问题 最近window来了一波强制更新 然后我发现在Android Studio内点运行 很容易就卡死在install处 完全不能动 只能在任务管理器上杀进程 用了很多办法都没解决 最后还是觉得是杀软的问题 处理了一下 解决办法 第一个办法
  • Python TimedRotatingFileHandler 多进程环境下的问题和解决方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题 Python 自带了一个 handler 可以实现每天自动切割日志文件的功能 其实支持各种按时间切割的方法 不过按日期切割是最常用的一种 切割 这件事的触发和执行逻辑
  • springboot在使用Scheduled做定时任务出现Autowired注入空指针

    错误示范 以往的依赖注入直接使用 Autowired Autowired BrowseRecordsService browseRecordsService ApiOperation 清除过期的浏览记录 public void remove
  • 【业务功能篇36】Springboot+activiti7 工作流引擎

    业务场景 前段时间总结的有一个告警工单流程 我们都是直接自己建表 状态节点 操作节点 都是自定义设计的 而到后面会有很多的工单流程 比如创建一个遗留问题电子流 指定处理人进行分析闭环 等等多种电子流 后期重复的开发工作以及维护工作会越来越多
  • C语言 递归实现汉诺塔问题 【图文讲解、简单易懂】

    汉诺塔问题是我们在学习函数递归时常遇见的一类问题 那么如何用简单易懂的思路来解决汉诺塔问题呢 下面我会为大家进行讲解 目录 汉诺塔是什么 汉诺塔的来源 用C语言实现汉诺塔 汉诺塔问题分析思路 用代码实现汉诺塔问题 总结 汉诺塔是什么 汉诺塔
  • 1 ubuntu18 docker配置与安装 镜像加速配置

    0 背景 搭建环境到创建第一个容器 1 搭建环境 需求 1 安装docker环境 2 镜像加速站 3 多台主机安装docker 1 1 docker环境 电脑为老联想电脑 cpu 2 7ghz 内存12GB 用vmware搞了两个ubunt
  • NOIP2014 Day2 模拟赛赛后总结&题解

    考试时的心态 还能有什么心态 考炸了嘛 题解 第一题 无线电通讯 水题 直接模拟 就不多说了 第二题 图论水题 其实也挺水的 只要倒着来广搜一遍 把能到达的边标记一下就可以了 接下来从起点出发BFS一遍就可以了 但是我考试的时候没有想那么多
  • 现在网红里骗子占一半。

    大家好 我是北妈 0 每天和身边朋友还有读者交流 打工没有出路 几乎成为打工人的普遍共识 也有越来越多人尝试或已经在实践打造个人 IP 超级个体品牌这条路 我的星球桃花岛 还有群也很多人每天在交流怎么做个人ip或者视频自媒体 大家都很想破圈
  • C++ STL::list常用操作及底层实现(中2)——实现list常用操作之删除(erase、remove、pop_front、pop_back、clear)

    list 常用操作及自底层实现 1 erase 按链表迭代器删除 1 1函数格式1 iterator erase iterator position 1 2函数格式2 iterator erase iterator first iterat