模拟实现vector之进阶篇

本文介绍了一个自定义Vector类的实现,重点在于迭代器功能的模拟实现。文章通过具体的代码示例展示了如何进行基本操作如push_back、pop_back等,并详细解释了迭代器的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前我们实现了一些基本的vector的实现vector基本实现
今天我们在之前的基础上,;模拟实现实现vector中的迭代器
之前写过有关库里面的vector是如何使用的:
链接一:vector基本功能的实现
链接二:vector中扩容函数区别

代码大军如下:

my_vector.cpp

#include <stdio.h>
#include <assert.h>
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

//模拟实现vector
template <class T>
class MyVector
{
  public:
    typedef T* Iterator;//用原生指针 类型重定义为 Iterator迭代器 
    typedef const T* const_Iterator;
    MyVector():_start(NULL),_finish(NULL),_end_of_storage(NULL)
    {}
    ~MyVector()
    {
      delete []_start;
      _start=_finish=_end_of_storage=NULL;
    }

    void  PushBack(const T & val)
    {
      //容量不够时就需要扩容
      if(_finish>=_end_of_storage)
      {
        Expand(Capacity()*2+1);
      }
      *_finish=val;
      _finish++;
    }
    void PopBack()
    {
      if(Size()==0)//表示顺序表为空
      {
        return;
      }
      else
      {
        _finish--;
      }
    }
    //*****************对顺序表进行扩容并初始化************************
    void Resize(size_t n ,const T & val=T())
    {
      if(n>Size())
      {
          if(n>Capacity())
          {
            //需要进行扩容
            Expand(n);
          }
          //上面进行扩容后。只是改变了容量
          //并没有改变size
          //然后对size和n之间的元素进行初始化
          //所以要手动的将_finish修改到正确的位置,这样才能保证下面的赋值操作正常进行,否则会段错误的
          _finish=_start+n;
          size_t i=0;
          for(i=Size();i<n;++i)
          {
            _start[i]=val;
          }
      }
      else
      {
        //如果n小于size
        _finish=_start+n;
        //将size减小
      }
    }


    //*****************对顺序表进行赋值************************
    void Assign(size_t n,const T &val= T())
    {
      if(n>Size())
      {
        if(n>Capacity())
        {
          Expand(n);
        }
        _finish=_start+n;
      }
      size_t i=0;
      for(i=0;i<n;++i)
      {
        _start[i]=val;
      }
    }

    //*****************对顺序表进行扩容************************
    void Reserve(size_t n)
    {
      if(n<=Capacity())
      {
        return;
      }
      else
      {
        Expand(n);
      }
    }

    //********************对顺序表进行插入***********************
    //********************对顺序表进行插入***********************                                                                                            
    Iterator Insert(const Iterator & pos,const T & val)                                                                                                      
    {                                                                                                                                                        
      assert(pos<=end());//可以进行尾插                                                                                                                      
      int gap=pos-begin();//这里要将pos的位置保存下来                                                                                                       
      //因为如果进行扩容的话pos的位置已经变了                                                                                                                
      if(_finish==_end_of_storage)                                                                                                                           
      {                                                                                                                                                      
        Expand(Capacity()*2+1);                                                                                                                              
      }                                                                                                                                                      
      pos=begin()+gap;                                                                                                                                       
      _finish++;                                                                                                                                             
      size_t i=0;                                                                                                                                            
      for(i=Size();i>pos-begin();--i)                                                                                                                        
      {                                                                                                                                                      
        _start[i]=_start[i-1];                                                                                                                               
      }                                                                                                                                                      
      *pos=val;                                                                                                                                              
    }                            
    //**********************对顺序表进行删除***********************

    Iterator Erase(const Iterator& pos)
    {
      assert(pos<end());

      Iterator cur=pos;
      while(cur<end()-1)
      {
        *cur=*(cur+1);
        cur++;
      }
      _finish--;
    }


    T& operator[](size_t pos)
    {
      assert(pos<Size());
      return _start[pos];
    }
    const T& operator[](size_t pos)const
    {
      assert(pos<Size());
      return _start[pos];
    }
    //****迭代器的接口
    Iterator begin()
    {
      return _start;
    }

    Iterator end()
    {
      return _finish;
    }
    const_Iterator begin() const
    {
      return _start;
    }

    const_Iterator end()  const
    {
      return _finish;
    }
    size_t Size()
    {
      return _finish-_start;
    }
    size_t Capacity()
    {
      return _end_of_storage-_start;
    }

  protected:
    Iterator _start;
    Iterator _finish;
    Iterator _end_of_storage;


    void Expand(size_t n)
    {
      if(n<=Capacity())
      {
        return;
      }
      else
      {
        size_t Size=this->Size();
        //注意这里要将Size()先保存下。
        //因为下面在新开的空间后再进行赋值时用到
        T * new_start=new T[n];
        size_t  i=0;
        //对新开的空间进行赋值。
        //这里不用memcpy()是因为T 的如果是自定义类型的话,存在深浅拷贝的问题
        for(i=0;i<Size;i++)
        {
          new_start[i]=_start[i];
        }
        //释放旧的空间
        delete [] _start;
        _start=NULL;

        //修改新空间的三个指针
        _start=new_start;
        _finish=_start+Size;//这里就不可以用Size()函数来求取Size 因为start位置已经变了
        _end_of_storage=_start+n;
      }
    }
};

mian.cpp

#include "my_vector.cpp"

//实现一个打印MyVector的函数
void PrintMyVector(const MyVector<int>& con)
{
  MyVector<int>::const_Iterator  it =con.begin();
  //因为在打印函数中不会修改容器的内容,用const 参数接收
  //那么迭代器也应该是const 的,还要实现了const的begin()和end();
  while(it!=con.end())
  {
    cout<<*it<<" ";
    it++;
  }
  cout<<endl;
}

void test1()
{
  MyVector<int> v1;
  v1.PushBack(1);
  v1.PushBack(2);
  v1.PushBack(3);
  v1.PushBack(4);
  v1.PushBack(5);

  PrintMyVector(v1);
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.PopBack();
  v1.PopBack();
  PrintMyVector(v1);
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Resize(12,8);
  PrintMyVector(v1);
  printf("Resize()会改变size,并且进行初始化\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Resize(3);
  PrintMyVector(v1);
  printf("Resize()会缩小size,但不会改变capacity()\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Reserve(20);
  PrintMyVector(v1);
  printf("Reserve只会改变capacity()\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Reserve(4);
  PrintMyVector(v1);
  printf("Reserve不会缩小容量\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Assign(3,6);
  PrintMyVector(v1);
  printf("Assign对容器进行赋值\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Assign(23,9);
  PrintMyVector(v1);
  printf("Assign会进行扩容,并且会进行多所有元素进行赋值\n");
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

}

void test2()
{
  MyVector<int> v1;
  v1.PushBack(1);
  v1.PushBack(2);
  v1.PushBack(3);
  v1.PushBack(4);
  v1.PushBack(5);

  PrintMyVector(v1);
  cout<<"Size:"<<v1.Size()<<endl;
  cout<<"Capacity:"<<v1.Capacity()<<endl;

  v1.Insert(v1.begin()+2,9);
  PrintMyVector(v1);

  v1.Insert(v1.begin()+4,12);
  PrintMyVector(v1);

  v1.Erase(v1.begin()+4);
  PrintMyVector(v1);

  v1.Erase(v1.begin()+2);
  PrintMyVector(v1);


}

int main()
{
  test1();
  test2();
  return 0;
}

执行结果
这里写图片描述

<think>嗯,用户的问题是关于如何在模拟经营游戏中实现人物行为。首先,我需要回忆一下模拟经营游戏的特点,这类游戏通常需要处理大量NPC的行为,这些行为要有一定的智能和自主性,同时还要让玩家觉得合理和有趣。 首先,可能需要考虑行为树或者状态机。状态机比较基础,适合处理简单状态转换,比如角色从工作切换到休息。而行为树更复杂,适合处理更复杂的行为逻辑,比如决策树中的各种条件判断。然后,用户可能还想知道如何让角色有自主性,这时候可能需要提到目标驱动系统,比如给角色设定需求层次,饥饿了去找食物,累了休息,这样看起来更真实。 接下来,用户可能关心路径规划,角色如何在游戏地图中移动,避免障碍物。这时候A*算法或者NavMesh是常用的解决方案,需要解释一下这些技术的基本原理。另外,环境交互也很重要,比如角色如何与物体互动,比如使用Unity的触发器或者碰撞检测。 然后是日程安排,模拟经营游戏中的角色通常有自己的日程表,按时间执行不同任务,可能需要用时间管理器来控制。事件响应机制,比如突发事件的处理,可能需要事件队列或者观察者模式。 还有用户提到的参考引用里有环境模拟,比如天气系统,这可能影响角色的行为,比如下雨时角色会躲雨,这里可以结合引用中的渲染和物理模拟部分,说明环境变化如何触发行为变化。 最后,性能优化也是关键,特别是当有很多角色时,需要对象池、行为分帧更新或LOD技术来优化资源使用。可能需要提到这些方法,以及如何根据距离调整行为复杂度。 用户可能还希望了解具体的实现步骤或者代码示例,比如状态机的代码结构,或者A*算法的简单实现。不过根据用户提供的示例,他们可能需要Python代码,但游戏开发常用C#,特别是Unity。不过用户给的示例里有Python代码,可能需要调整。 还要注意生成相关问题,比如如何优化多角色行为,如何处理行为冲突,如何设计行为树等,这些能帮助用户深入了解更多细节。 总结一下,回答的结构应该是先分点讲解不同的实现方法,然后给出代码示例,最后生成相关问题。需要确保使用正确的中文术语,并且LaTeX格式正确,比如提到算法时用$A^*$,数学公式用$$包裹。</think>在模拟经营游戏中实现人物行为通常需要结合AI系统、状态机和行为树等技术。以下是关键实现方法及示例代码: ### 一、核心实现方法 1. **有限状态机(FSM)** - 定义角色基本状态:$S = \{空闲,移动,工作,交互\}$ - 状态转移条件:$当角色饥饿值 \geq 80 \rightarrow 前往餐厅$ ```csharp enum NPCState { Idle, Moving, Working } void UpdateState() { if (hunger > 80) currentState = NPCState.Moving; } ``` 2. **行为树系统** ```python class SelectorNode: def execute(self, npc): for child in self.children: if child.execute(npc): return True class ActionNode: def execute(self, npc): npc.find_food() ``` 3. **需求驱动模型** 基于马斯洛需求层次理论,建立优先级队列: $$P = \max(\frac{饥饿值}{100}, \frac{疲劳值}{80})$$ ### 二、关键技术实现 1. **路径规划** - 使用$A^*$算法实现网格寻路 ```csharp List<Vector3> AStarPathfinding(Node start, Node end) { // A*算法实现 } ``` 2. **环境交互** 通过Unity触发器检测交互范围[^2]: ```csharp void OnTriggerEnter(Collider other) { if (other.tag == "Food") StartEating(); } ``` 3. **日程系统** 基于游戏时间刻度的行为调度: ```python class Schedule: def get_current_task(self, game_time): if 8 <= game_time < 18: return "工作" else: return "休息" ``` ### 三、进阶优化方案 1. **群体行为模拟** 使用Boids算法实现群体移动: $$v_{new} = \alpha v_{align} + \beta v_{cohesion} + \gamma v_{separation}$$ 2. **情感影响系统** 情绪值影响行为选择概率: $$P(暴怒) = \frac{1}{1 + e^{-(压力值-70)}}$$ 3. **机器学习应用** 使用Q-learning算法优化行为决策: $$Q(s,a) \leftarrow Q(s,a) + \alpha[r + \gamma \max_{a'}Q(s',a') - Q(s,a)]$$
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值