在实现list时所遇到的问题

简介: 在实现list时所遇到的问题

问题一:临时变量具有常性问题

在list中具体的场景:

在list中,iterator迭代器被封装成了类,iterator类中有 operator!= 这一重载函数

template <class T>
  struct __list_iterator
  {
    typedef list_node<T> Node;//结点重命名为Node
    __list_iterator(Node* node)
      :_node(node)
    {}
 
    bool operator!=( __list_iterator& it)
    {
      return _node!= it._node;
    }
    Node* _node;
  };

//iterator本质上还是一个指向Node类型的指针。

调用 operator!=

  tsj::list<int> lt1;
  lt1.push_back(1);
  lt1.push_back(2);
  lt1.push_back(3);
  tsj::list<int>::iterator it = lt1.begin();
  while (it != lt1.end())
  {
    (*it) += 1;
    cout << *it << " ";
    ++it;
  }
  cout << endl;

编译器会报错,如下:

我们不是写了!=的重载函数吗?报错说不匹配,那么只可能是参数不匹配。

实参是:lt1.end() ,形参是:__list_iterator& it

end()函数如下:

  template <class T>
  class list
  {
  public:
    typedef __list_iterator<T> iterator;
    typedef list_node<T> Node;
    list()
    {
      _head = new Node;
      _head->_prev = _head;
      _head->_next = _head;
    }
  
    iterator end()
    {
      return _head->_prev;
    }
  private:
    Node* _head;
  };

函数的返回方式有两类,一类是传值返回,一类是传引用返回。这里是传值返回。

传值返回的特点是,返回值会被寄存到一个临时对象中,函数调用结束后临时对象的内容再赋值给函数调用处,且临时对象具有常性。

那么问题找到了,end()的 返回值具有常性,而形参__list_iterator& it不具有常性。因此二者的类型不匹配,所以编译器才会报如上错误。

解决方法就是在__list_iterator& it前加上const。

问题二:单参数的构造函数支持隐式类型转换  

仍然是end()函数

_head->_prev 是指针,返回类型却是iterator,很显然二者类型不同。那他为什么可以传回去呢?上述过程等价于 __list_iterator& it=_head->_prev;上文已经提到,end()是传值返回,_head->_prev 的内容被存放到一个临时对象中,然后传递给__list_iterator& it,会调用__list_iterator中的拷贝构造函数,而拷贝构造函数的形参与_head->_prev类型一致。

对这部分总结一下:单参数的构造函数支持隐式类型转换  ,形如 __list_iterator& it=_head->_prev

看似两边的类型不同,本质上是由于=右边的类型与类的成员变量类型一致,因此会发生隐式类型转换。

相关文章
|
11天前
|
数据采集 人工智能 安全
|
6天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
326 164
|
5天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
328 155
|
6天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
391 4
|
14天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
925 7