首页 > 其他分享 >STL-List常用接口

STL-List常用接口

时间:2024-09-09 18:21:37浏览次数:3  
标签:node __ iterator STL List list 接口 ++ lt

List常用接口

insert

list<int>::iterator pos = find(lt.begin(), lt.end(), 3);
if (pos != lt.end())
	lt.insert(pos, 30);
for (auto e : lt)
	cout << e << " ";
cout << endl;

list的不会失效,而vector会失效。

erase后均会失效。

解决迭代器失效问题

list<int>::iterator it = lt.begin();
while (it != lt.end())
{
	if (*it % 2 == 0)
		it = lt.erase(it);
	else
		it++;
}

核心 erase会返回以删除位置的下一个位置。

清空列表的两种方式

while (it != lt.end())
{
	lt.erase(it++);
}
lt.clear();

模拟实现list

模拟node节点

template<class T>
struct __list_node
{
	__list_node<T>* _next;
	__list_node<T>* _prev;
	T _data;
	__list_node(const T& x=T())
		:_data(x)
		,_next(nullptr)
		,_prev(nullptr)
	{}
};

模拟构造迭代器

template<typename T>
struct __list_iterator
{
	typedef __list_node<T> Node;
	Node* _node;
	__list_iterator(Node* node)
		:_node(node)
	{}
	//*it;
	T& operator*()
	{
		return _node->_data;
	}
	//++it
	__list_iterator<T> operator++()
	{
		_node = _node->_next;
		return *this;
	}
	//it!=end()
	bool operator!=(__list_iterator<T>& it)
	{
		return _node != it->_node;

	}
};

 按照STL原码模拟实现list的结构

template<class T>
class list
{
	typedef struct __list_node<T> Node;
	typedef __list_iterator<T> iterator;
public:
	iterator begin()
	{
		return iterator(_head->_next);
	}
	iterator end()
	{
		return iterator(_head);
	}
	//带头双向循环列表
	list()
	{
		_head = new node;
		_head->_next = _head;
		_head->_prev = _head;
	}
	void push_back(const T& x)
	{
		Node* tail = _head->_prev;
		Node* newnode = new Node(x);
		
		tail->_next = newnode;
		newnode->_prev = tail;
		_head->_prev = newnode;
		newnode->_next = _head;

	}
private:
	Node* _head;
};

iterator begin()
{
	return iterator(_head->_next);
}
iterator end()
{
	return iterator(_head);
}

有了迭代器就可以使用范围for 

T* operator->()
{
	return &_node->_data;
}
struct Date
{
	int _year = 0;
	int _mouth = 1;
	int _day = 1;
};
void test_list()
{
	list<Date> lt;
	lt.push_back(Date());
	lt.push_back(Date());
	list<Date>::iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << it->_year << it->_mouth << it->_day << endl;
		++it;
	}
}

while (it != lt.end())
{
	//cout << it->_year << it->_mouth << it->_day << endl;
	cout << (*it)._year << (*it)._mouth << (*it)._day << endl;
	++it;
}

前后置++ 

//++it
__list_iterator<T>& operator++()
{
	_node = _node->_next;
	return *this;
}
__list_iterator<T>& operator++()
{
	_node = _node->_prev;
	return *this;
}
//it++	 
__list_iterator<T> operator++(int)
{
	__list_iterator<T> tmp(*this);
	_node = _node->_next;
	return tmp;
}
//it++	 
__list_iterator<T> operator++(int)
{
	__list_iterator<T> tmp(*this);
	_node = _node->_next;
	//(*this)++;
	return tmp;
}

标签:node,__,iterator,STL,List,list,接口,++,lt
From: https://blog.csdn.net/2301_77479435/article/details/142059702

相关文章

  • Runnable 接口是如何“新建”线程的
    Runnable接口是Java中用于创建线程的基础接口之一,它定义了一个无参无返回的方法run(),而在我们的认知中,其是创建线程的方法之一,使得对象可以在线程中执行,而无需继承Thread类。一、Runnable接口如何“新建”线程事实上,这个所谓的“新建”只是一个通俗的叫法,就Java而言,代表线......
  • nn.Sequential 和 nn.ModuleList()的联系与区别
    nn.Sequential和nn.ModuleList()是PyTorch中用于管理神经网络模型中的子模块的两种不同的方式。nn.Sequential是一个用于构建顺序模型的容器类。它允许按照给定的顺序添加一系列的子模块,并将它们串联在一起形成一个顺序的网络结构。nn.Sequential可以简化模型的定义和前向传......
  • CMakeLists.txt 和 Makefile
    CMakeLists.txt和Makefile都是用于自动化编译和构建软件项目的配置文件,但它们在构建系统中扮演不同的角色,并且使用不同的构建工具。CMakeLists.txtCMakeLists.txt 文件是CMake构建系统的配置文件。CMake是一个跨平台的自动化构建系统,它使用 CMakeLists.txt 文件来生......
  • 【C++】C++ STL 探索:List使用与背后底层逻辑
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现本文将通过模拟实现List,从多个角度深入剖析其底层机......
  • PLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)__QUERYINTERFACE运算符__QUERYPOINTER是IEC61131-3的扩展,该运算符允许在运行时将一个接口引用转换成另一个接口的引用。返回值BOOL类型:True表示转换成功,Flase表示转换失败。......
  • Python3+requests搭建接口自动化测试框架_python3 import requests
    框架理念:使用json文件编写测试用例,建一个脚本循环读取测试用例并执行,然后对比返回的接口和用例中的期望结果。将测试结果写入到一个excel表格中生成测试报告,最后使用发送邮件功能将测试报告发送到指定邮箱。其中对所有公共方法进行封装并放在common公共文件目录下。  ......
  • PLC结构化文本(ST)——接口指针转换运算符(__QUERYPOINTER)
    PLCStructuredTextObjectOrientedProgrammingPLC结构化文本(ST)——接口指针转换运算符(__QUERYPOINTER)__QUERYPOINTER运算符__QUERYPOINTER是IEC61131-3的扩展,该运算符允许在运行时将功能块的接口引用转换为指针。返回值BOOL类型:True表示转换成功,Flase表示转换失败。出于......
  • 商城上货过程如何选择API接口提高工作效率至关重要!!
    商城上货过程中选择合适的API接口对于提高工作效率至关重要。以下是一些关键步骤和考虑因素,以帮助商城做出明智的选择:一、明确需求业务需求识别:确定商城需要哪些具体的功能和数据,如商品信息、库存管理、订单处理、支付接口、物流跟踪等。分析商城的业务流程,明确API接口在......
  • 发票真伪识别接口费用-发票真伪查验接口-发票验真示例
    发票信息核验是一个重要的财务和会计过程,涉及到对发票上的信息进行验证,以确保其真实性和准确性。在数字化时代,这一过程企业通常想通过调用发票查验接口的方式实现自动化管理模式。发票查验接口费用不同的服务提供商会有不同的收费标准,例如翔云平台提供的发票验真接口可以免费测试......
  • 身份证实名认证接口费用-身份证信息核验-实名认证示例
    身份证信息核验是实名认证中一种常见的认证方式,它通过比对用户提交的身份证信息与权威数据库中的信息,来确认用户身份是否真实有效,一般情况下,线上平台实现实名认证功能主要依赖于调用第三方接口​平台来实现。实名认证接口费用通常由提供该服务的第三方平台来设定,以翔云实名认......